code:
<LanguageData>
    <OnaholeBond.label>Связан</OnaholeBond.label>
    <OnaholeBond.description>Тело ограничено, не может двигаться или действовать</OnaholeBond.description>
    <OnaholeGenitalElectrodes.label>Генитальные электроды</OnaholeGenitalElectrodes.label>
    <OnaholeGenitalElectrodes.description>Электроды, стимулирующие область половых органов</OnaholeGenitalElectrodes.description>
    <OnaholeBreastElectrodes.label>Грудные электроды</OnaholeBreastElectrodes.label>
    <OnaholeBreastElectrodes.description>Электроды, стимулирующие грудь</OnaholeBreastElectrodes.description>
    <OnaholeVaginalSexMachine.label>Вагинальная секс-машина</OnaholeVaginalSexMachine.label>
    <OnaholeVaginalSexMachine.description>Машины, которые проникают во влагалище</OnaholeVaginalSexMachine.description>
    <OnaholeAnalSexMachine.label>Анальная секс-машина</OnaholeAnalSexMachine.label>
    <OnaholeAnalSexMachine.description>Машины, которые проникают в анус</OnaholeAnalSexMachine.description>
    <OnaholeMilkingMachine.label>Доильный аппарат</OnaholeMilkingMachine.label>
    <OnaholeMilkingMachine.description>Присоски на доильном аппарате для доения молочных желез</OnaholeMilkingMachine.description>
    <OnaholeAutoFeeder.label>Аппарат для выкармливания</OnaholeAutoFeeder.label>
    <OnaholeAutoFeeder.description>Кормление заложников с помощью сохраненной пищи или жидкости</OnaholeAutoFeeder.description>
</LanguageData>


code:
<LanguageData>
    <BeOnahole.reportString>Привязаны как Онахол</BeOnahole.reportString>
    <BindOnahole.reportString>Связать TargetA</BindOnahole.reportString>
    <UnbindOnahole.reportString>Развязать TargetA</UnbindOnahole.reportString>
    <UseOnahole.reportString>Использовать онахола TargetA</UseOnahole.reportString>
    <RefillFeederFood.reportString>Заполнить аппарат для выкармливания TargetA</RefillFeederFood.reportString>
    <RefillDrugInfuser.reportString>Заправить капельницу TargetA</RefillDrugInfuser.reportString>
</LanguageData>

repo_name: atainer/rimjobworld

license: mit


code:
<LanguageData>
    <OnaholeMetalFrame.label>Металлическая рамка</OnaholeMetalFrame.label>
    <OnaholeMetalFrame.description>Простая металлическая рама для удержания заключенного. Заключенный не может двигаться или действовать. Ее можно поместить в тюрьму или в другое место.</OnaholeMetalFrame.description>
    <OnaholeHorseMount.label>Козлы</OnaholeHorseMount.label>
    <OnaholeHorseMount.description>Приковывает заключенного к треугольному устройству с одним концом треугольника, направленным вверх. Заключенный не может двигаться или действовать. Его можно поместить в тюрьму или в другое место.</OnaholeHorseMount.description>
    <OnaholePole.label>Столб</OnaholePole.label>
    <OnaholePole.description>Простой столб, к которому привязывают заключенного. Заключенный не может двигаться или действовать. Его можно поместить в тюрьму или в другое место.</OnaholePole.description>
    <OnaholePillory.label>Позорный столб</OnaholePillory.label>
    <OnaholePillory.description>Позорный столб, который удерживает голову и руки заключенного на месте. Заключенный не может двигаться или действовать. Его можно поместить в тюрьму или в другое место.</OnaholePillory.description>
    <OnaholeHanger.label>Велашка</OnaholeHanger.label>
    <OnaholeHanger.description>Большая металлическая вешалка, чтобы повесить заключенного. Заключенный не может двигаться или действовать. Ее можно поместить в тюрьму или в другое место.</OnaholeHanger.description>
    <OnaholeCross.label>Крест</OnaholeCross.label>
    <OnaholeCross.description>Простой крест, к которому приковывают заключенного. Заключенный не может двигаться или действовать. Его можно поместить в тюрьму или в другое место.</OnaholeCross.description>
</LanguageData>


code:
<LanguageData>
    <RefillFeederFood.label>Пополняет аппарат для выкармливания</RefillFeederFood.label>
    <RefillFeederFood.verb>Пополнить аппарат для выкармливания </RefillFeederFood.verb>
    <RefillFeederFood.gerund>Пополнять аппарат для выкармливания</RefillFeederFood.gerund>
    <RefillDrugInfuser.label>Пополняет капельницу</RefillDrugInfuser.label>
    <RefillDrugInfuser.verb>Пополнить капельницу</RefillDrugInfuser.verb>
    <RefillDrugInfuser.gerund>Пополнять капельницу</RefillDrugInfuser.gerund>
</LanguageData>


code:
<LanguageData>
    <RJW_Onahole>RJW Онахол</RJW_Onahole>
    <RJW_Onahole_Settings>Онахол</RJW_Onahole_Settings>
    <RJW_Onahole_Free>Бесплатно</RJW_Onahole_Free>
    <RJW_Onahole_CustomTransforms>Пользовательские преобразования текстур</RJW_Onahole_CustomTransforms>
    <RJW_Onahole_ForGuestUse_Desc>Разрешить гостям пользоваться онахолом, если цена не 0, гости заплатят за него</RJW_Onahole_ForGuestUse_Desc>
    <RJW_Onahole_ForAnimalUse_Desc>Разрешить животным использовать онахолом, эта настройка переопределит настройку RJW</RJW_Onahole_ForAnimalUse_Desc>
    <RJW_Onahole_ForInsectUse_Desc>Разрешить насекомым использовать онахол, эта настройка переопределит настройку RJW</RJW_Onahole_ForInsectUse_Desc>
    <RJW_Onahole_ForMechanoidUse_Desc>Разрешить механоидам использовать онахол. Если оплодотворить механоидом, родившийся будет автоматически взломан</RJW_Onahole_ForMechanoidUse_Desc>
    <RJW_Onahole_GenitalElectrodes>Генитальные электроды</RJW_Onahole_GenitalElectrodes>
    <RJW_Onahole_GenitalElectrodes_Desc>Прикрепите электроды к области гениталий \n Выкл:только внешний вид \n Стимулировать: небольшое количество удовольствия \n Боль: большое количество удовольствия, с интенсивной болью, которая блокирует сон \n Ожог: небольшое количество удовольствия, с прямым повреждением гениталий, котороеможет вызвать выкидыш</RJW_Onahole_GenitalElectrodes_Desc>
    <RJW_Onahole_BreastElectrodes>Грудные электроды</RJW_Onahole_BreastElectrodes>
    <RJW_Onahole_BreastElectrodes_Desc>Наклеивание электродов на грудь, ускорение лактации \n Выкл: только внешний вид \n Стимулировать: небольшое усиление \n Боль: среднее усиление, с интенсивной болью, которая блокирует сон \n Ожог: большое усиление, с прямым повреждением груди</RJW_Onahole_BreastElectrodes_Desc>
    <RJW_Onahole_VaginalSexMachine>Вагинальная секс-машина</RJW_Onahole_VaginalSexMachine>
    <RJW_Onahole_VaginalSexMachine_Desc>Установите вагинальную секс-машину онахолу</RJW_Onahole_VaginalSexMachine_Desc>
    <RJW_Onahole_AnalSexMachine>Анальная секс-машина</RJW_Onahole_AnalSexMachine>
    <RJW_Onahole_AnalSexMachine_Desc>Установите анальную секс-машину онахолу</RJW_Onahole_AnalSexMachine_Desc>
    <RJW_Onahole_MilkingMachine>Доильный аппарат</RJW_Onahole_MilkingMachine>
    <RJW_Onahole_MilkingMachine_Desc> Установите доильный аппарат для доения в отверстии, более высокая скорость вызовет большую боль в груди </RJW_Onahole_MilkingMachine_Desc>
    <RJW_Onahole_CumCollector>Сборщик спермы</RJW_Onahole_CumCollector>
    <RJW_Onahole_CumCollector_Desc>Собирает сперму вытекающую из онахола</RJW_Onahole_CumCollector_Desc>
    <RJW_Onahole_AutoFeeder>Аппарат для выкармливания</RJW_Onahole_AutoFeeder>
    <RJW_Onahole_AutoFeeder_Desc>Автоматически кормит онахол, используя указанную еду и жидкость</RJW_Onahole_AutoFeeder_Desc>
    <RJW_Onahole_DrugInfuser>Капельница</RJW_Onahole_DrugInfuser>
    <RJW_Onahole_DrugInfuser_Desc>Автоматически использовать водержащийся внутри капельницы препарат для восполнения химической потребности онахола или поддержания эффекта препарата</RJW_Onahole_DrugInfuser_Desc>
    <RJW_Onahole_AllowAutoRefill>Разрешить автоматическое пополнение</RJW_Onahole_AllowAutoRefill>
    <RJW_Onahole_SetTargetLevel>Установить целевой количество</RJW_Onahole_SetTargetLevel>
    <RJW_Onahole_EditTransform>Изменить расположение</RJW_Onahole_EditTransform>
    <RJW_Onahole_EditTransform_Desc> Редактировать смещение определенных текстур, используемых для выравнивания относительно нестандартных текстур</RJW_Onahole_EditTransform_Desc>
    <RJW_Onahole_DesignateColonyUsers>Назначить пользователей колонии</RJW_Onahole_DesignateColonyUsers>
    <RJW_Onahole_DesignateColonyUsers_Desc> Назначьте, кто в колонии может использовать онахола, если не указано, разрешено будет всем</RJW_Onahole_DesignateColonyUsers_Desc>
    <RJW_Onahole_Unbind>Отвязать</RJW_Onahole_Unbind>
    <RJW_Onahole_Bind>Привязать</RJW_Onahole_Bind>
    <RJW_Onahole_HaulCoolDownTicks>Ресурсы из конструкций Онахолов извлекаются не чаще чем значение данного параметра (В тиках)</RJW_Onahole_HaulCoolDownTicks>
    <RJW_Onahole_MaxFluidStorage>Максимальный объем хранения жидкости (мл)</RJW_Onahole_MaxFluidStorage>
    <RJW_Onahole_AppraiseMultiplier>Множитель оценки Онахола</RJW_Onahole_AppraiseMultiplier>
    <RJW_Onahole_AppraiseOffset>Бонус оценки Онахола</RJW_Onahole_AppraiseOffset>
    <RJW_Onahole_PriceAppraiseZero>Цена Онахола при нулевой (Минимальной) оценке</RJW_Onahole_PriceAppraiseZero>
    <RJW_Onahole_PriceAppraiseOne>Цена Онахола при оценке равной 1 (Максимальной)</RJW_Onahole_PriceAppraiseOne>
    <RJW_Onahole_Offset>Смещение (Offset)</RJW_Onahole_Offset>
    <RJW_Onahole_Scale>Масштабирование (Scale)</RJW_Onahole_Scale>
    <RJW_Onahole_Stimulate>Стимулировать</RJW_Onahole_Stimulate>
    <RJW_Onahole_FluidStorage>Резервуар для жидкостй</RJW_Onahole_FluidStorage>
    <RJW_Onahole_ChangeBindStyle>Изменить стиль пут</RJW_Onahole_ChangeBindStyle>
    <RJW_Onahole_OnaholeBedStorage>Хранилище</RJW_Onahole_OnaholeBedStorage>
    <RJW_Onahole_StripOnBind>Раздевать Онахолов прежде чем привязать</RJW_Onahole_StripOnBind>
    <RJW_Onahole_UseReduceResistance>Уменьшить сопротивление Онахола при использовании</RJW_Onahole_UseReduceResistance>
    <RJW_Onahole_OrgasmReduceWill>Оргазм уменьшит волю</RJW_Onahole_OrgasmReduceWill>
    <RJW_Onahole_OrgasmReduceCertainty>Оргазм снижает уверенность</RJW_Onahole_OrgasmReduceCertainty>
    <RJW_Onahole_MachineBlocksParts>Машина блокирует части тела для секса</RJW_Onahole_MachineBlocksParts>
    <RJW_Onahole_ShowCrossSections>Показывать анимции внутренних процессов в визуальных сносках</RJW_Onahole_ShowCrossSections>
    <RJW_Onahole_ShowExtraGraphics>Показать дополнительную графику</RJW_Onahole_ShowExtraGraphics>
    <RJW_Onahole_Show>Показывать</RJW_Onahole_Show>
    <RJW_Onahole_SetRestriction>Разрешить/запретить использование онахола</RJW_Onahole_SetRestriction>
    <RJW_Onahole_Feed>Кормить онахола</RJW_Onahole_Feed>
    <RJW_Onahole_CantFeed>Нельзя использовать в пищу продукты с нулевой пищевой ценностью</RJW_Onahole_CantFeed>
    <RJW_Onahole_AutoConvert>Автоматически конвертировать предметы в хранилище</RJW_Onahole_AutoConvert>
    <RJW_Onahole_Destroy>Разрушить</RJW_Onahole_Destroy>
    <RJW_Onahole_NoConvertibleItem>Предмет неконвертируем</RJW_Onahole_NoConvertibleItem>
    <!-- Enums -->
    <RJW_Onahole_Factionless>Без фракции</RJW_Onahole_Factionless>
    <RJW_Onahole_Insect>Инсектоид</RJW_Onahole_Insect>
    <!-- Messages -->
    <RJW_Onahole_QuitRaiding> {0} {1} использовал онахола {2} теперь слишком измотан для рейда и решил уйти</RJW_Onahole_QuitRaiding>
    <!-- Brothel Colony -->
    <RJW_Onahole_BrothelColony>Колония-бордель</RJW_Onahole_BrothelColony>
    <RJW_Onahole_UseBrothelPrice>Используйте для Онахола цену из мода BrothelColony</RJW_Onahole_UseBrothelPrice>
    <RJW_Onahole_OverrideBedScore>Переопределить оценку кровати</RJW_Onahole_OverrideBedScore>
    <RJW_Onahole_BedScore>Оценка кровати</RJW_Onahole_BedScore>
    <RJW_Onahole_PayGoodwill>Платить отношением</RJW_Onahole_PayGoodwill>
    <RJW_Onahole_FinalPrice>Окончательная цена</RJW_Onahole_FinalPrice>
    <!-- DBH -->
    <RJW_Onahole_Shower>Душ</RJW_Onahole_Shower>
    <RJW_Onahole_Shower_Desc>Автоматически обмывать онахола при необходимости</RJW_Onahole_Shower_Desc>
</LanguageData>


code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<loadFolders>
	<v1.5>

Mods/Animations

Mods/Menstruation

Mods/BondageBed

Mods/HAR

Mods/SizedApparel

Mods/BrothelColony

Mods/DubsBadHygiene

Mods/FacialAnimation

Mods/NutrientPaste

Mods/PipeNetwork

Mods/RimNudeWorld

Mods/Cumpilation

Mods/Hospitality

Mods/Sexperience_Ideo

Mods/Privacy

	</v1.5>
</loadFolders>


code:
fileFormatVersion: 2
guid: f15938d0dc5983d48813eb6e75f66ec2
folderAsset: yes
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:


code:
ManifestFileVersion: 0
CRC: 1294026067
Hashes:
  AssetFileHash:
    serializedVersion: 2
    Hash: c609b5b3771c78cc7029b118af503b32
  TypeTreeHash:
    serializedVersion: 2
    Hash: 55d48f4ad9c3b13330b9eb5ee5686477
HashAppended: 0
ClassTypes:
- Class: 48
  Script: {instanceID: 0}
SerializeReferenceClassIdentifiers: []
Assets:
- Assets/Shaders/InstancedAnimationF16.shader
- Assets/Shaders/BezierCurveShader.shader
- Assets/Shaders/InvertMaskAlpha.shader
- Assets/Shaders/SimpleAlpha.shader
- Assets/Shaders/InstancingTest.shader
- Assets/Shaders/InheritMaskAlpha.shader
- Assets/Shaders/InstancedAnimation.shader
Dependencies: []


code:
fileFormatVersion: 2
guid: 67efd58b6fcc3a845a31c2a986e668ec
TextScriptImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:


code:
fileFormatVersion: 2
guid: 3efc2fb400bb3ea41a1adac0d2b76144
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:


code:
fileFormatVersion: 2
guid: e5f169cc422e2884488c859dac28d36e
folderAsset: yes
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:


code:
ManifestFileVersion: 0
CRC: 3333043613
Hashes:
  AssetFileHash:
    serializedVersion: 2
    Hash: 2573293547a6f631b57ba720f2c4dbf8
  TypeTreeHash:
    serializedVersion: 2
    Hash: 55d48f4ad9c3b13330b9eb5ee5686477
HashAppended: 0
ClassTypes:
- Class: 48
  Script: {instanceID: 0}
SerializeReferenceClassIdentifiers: []
Assets:
- Assets/Shaders/InstancedAnimationF16.shader
- Assets/Shaders/BezierCurveShader.shader
- Assets/Shaders/InvertMaskAlpha.shader
- Assets/Shaders/SimpleAlpha.shader
- Assets/Shaders/InstancingTest.shader
- Assets/Shaders/InheritMaskAlpha.shader
- Assets/Shaders/InstancedAnimation.shader
Dependencies: []


code:
fileFormatVersion: 2
guid: ea2f1627a65305d4382c9dea327dd74e
TextScriptImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:


code:
fileFormatVersion: 2
guid: 5e93115a5081f1346b37c61c23a94316
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:


code:
fileFormatVersion: 2
guid: 4874ecf2e00e3e64d83d4346eb7d650c
folderAsset: yes
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:


code:
ManifestFileVersion: 0
CRC: 3996078468
Hashes:
  AssetFileHash:
    serializedVersion: 2
    Hash: 9b88731da789fbfe3991713c302b192f
  TypeTreeHash:
    serializedVersion: 2
    Hash: 55d48f4ad9c3b13330b9eb5ee5686477
HashAppended: 0
ClassTypes:
- Class: 48
  Script: {instanceID: 0}
SerializeReferenceClassIdentifiers: []
Assets:
- Assets/Shaders/InstancedAnimationF16.shader
- Assets/Shaders/BezierCurveShader.shader
- Assets/Shaders/InvertMaskAlpha.shader
- Assets/Shaders/SimpleAlpha.shader
- Assets/Shaders/InstancingTest.shader
- Assets/Shaders/InheritMaskAlpha.shader
- Assets/Shaders/InstancedAnimation.shader
Dependencies: []


code:
fileFormatVersion: 2
guid: d40b2add49bed634ea280d85f15d0b6c
TextScriptImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:


code:
fileFormatVersion: 2
guid: 9b866a7c9ec0ae04abbde93a4ce6452b
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:


code:
Shader "Onahole/BezierCurveShader"
{
    Properties
    {
        _MainTex ("Main texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" }
        Blend SrcAlpha OneMinusSrcAlpha
        ZWrite Off
        ZTest Always
        Cull Off
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float4 color : COLOR;
                UNITY_VERTEX_OUTPUT_STEREO
            };

            sampler2D _MainTex;

            UNITY_INSTANCING_BUFFER_START(Props)
                UNITY_DEFINE_INSTANCED_PROP(float4, _Color)    // Base color
                UNITY_DEFINE_INSTANCED_PROP(float4, _P0)      // Control point 0 (world space)
                UNITY_DEFINE_INSTANCED_PROP(float4, _P1)      // Control point 1 (world space)
                UNITY_DEFINE_INSTANCED_PROP(float4, _P2)      // Control point 2 (world space)
                UNITY_DEFINE_INSTANCED_PROP(float, _Thickness) // Thickness of the curve
            UNITY_INSTANCING_BUFFER_END(Props)

            v2f vert (appdata v)
            {
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                v2f o;
                o.color = UNITY_ACCESS_INSTANCED_PROP(Props, _Color);

                // Retrieve world-space positions of control points
                float3 p0 = UNITY_ACCESS_INSTANCED_PROP(Props, _P0).xyz;
                float3 p1 = UNITY_ACCESS_INSTANCED_PROP(Props, _P1).xyz;
                float3 p2 = UNITY_ACCESS_INSTANCED_PROP(Props, _P2).xyz;
                float thickness = UNITY_ACCESS_INSTANCED_PROP(Props, _Thickness);

                // Compute Bézier curve position
                float t = v.uv.x; // Use UV.x to interpolate along the curve
                float3 pointOnCurve = pow(1.0 - t, 2.0) * p0 +
                                      2.0 * (1.0 - t) * t * p1 +
                                      pow(t, 2.0) * p2;

                // Compute the tangent of the curve
                float3 tangent = normalize(
                    2.0 * (1.0 - t) * (p1 - p0) +
                    2.0 * t * (p2 - p1)
                );

                // Compute perpendicular direction in the ZX plane
                float3 perpendicular = normalize(float3(-tangent.z, 0.0, tangent.x));

                // Apply uniform thickness along this perpendicular
                float3 offsetPosition = pointOnCurve + perpendicular * (v.uv.y - 0.5) * thickness;

                o.pos = UnityWorldToClipPos(mul(unity_ObjectToWorld,float4(offsetPosition, 1.0)));

                // UV mapping for texture
                float lengthEstimate = length(p2 - p0);
                float tilingFactor = lengthEstimate / thickness;
                o.uv = float2(t * tilingFactor, v.uv.y);
                return o;
            }

            float4 frag (v2f i) : SV_Target
            {
                float4 texColor = tex2D(_MainTex, i.uv);
                return texColor * i.color;
            }
            ENDCG
        }
    }
}


code:
Shader "Onahole/InheritMaskAlpha" {
    Properties {
        _MainTex ("Main texture", 2D) = "white" {}
        _MaskTex ("Mask texture", 2D) = "white" {}
        _Color ("Color", Vector) = (1,1,1,1)
        _Main_TexOffset ("Main texcoord offset", Vector) = (0,0,0,0)
        _Main_TexScale ("Main texcoord scale", Vector) = (1,1,1,1)
        _Mask_TexOffset ("Mask texcoord offset", Vector) = (0,0,0,0)
        _Mask_TexScale ("Mask texcoord scale", Vector) = (1,1,1,1)
    }

    SubShader {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" "PreviewType" = "Plane"}
        LOD 200

        // Enable blending for transparent textures
        Blend SrcAlpha OneMinusSrcAlpha

        CGPROGRAM
        #pragma surface surf Standard alpha:fade
        #pragma target 5.0
        #pragma multi_compile_instancing
        #include "UnityCG.cginc"

        sampler2D _MainTex;  // Non-instanced
        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_DEFINE_INSTANCED_PROP(sampler2D, _MaskTex)  // Instanced mask texture
        UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color)       // Instanced color

        UNITY_DEFINE_INSTANCED_PROP(float4, _Main_TexOffset)  // Instanced
        UNITY_DEFINE_INSTANCED_PROP(float4, _Main_TexScale)   // Instanced
        UNITY_DEFINE_INSTANCED_PROP(float4, _Mask_TexOffset)  // Instanced
        UNITY_DEFINE_INSTANCED_PROP(float4, _Mask_TexScale)   // Instanced
        UNITY_INSTANCING_BUFFER_END(Props)

        struct Input {
            float2 uv_MainTex;
        };

        // Function to apply scaling and offset transformations
        float2 ApplyTransform(float2 uv, float4 offset, float4 scale) {
            // Apply scaling from the center
            uv = (uv - 0.5) / scale.xy + 0.5;

            // Apply offset
            uv += offset.xy;

            return uv;
        }

        void surf(Input IN, inout SurfaceOutputStandard o) {
            // Apply transforms to main texture coordinates
            float2 mainUV = ApplyTransform(IN.uv_MainTex, UNITY_ACCESS_INSTANCED_PROP(Props, _Main_TexOffset), UNITY_ACCESS_INSTANCED_PROP(Props, _Main_TexScale));

            // Sample main texture with transparency
            fixed4 mainTexColor = tex2D(_MainTex, mainUV) * UNITY_ACCESS_INSTANCED_PROP(Props, _Color);

            // Apply transforms to mask texture coordinates
            float2 maskUV = ApplyTransform(IN.uv_MainTex, UNITY_ACCESS_INSTANCED_PROP(Props, _Mask_TexOffset), UNITY_ACCESS_INSTANCED_PROP(Props, _Mask_TexScale));

            // Sample mask texture
            fixed4 maskTexColor = tex2D(UNITY_ACCESS_INSTANCED_PROP(Props, _MaskTex), maskUV);

            // Multiply the main texture's alpha by the mask's alpha channel
            float finalAlpha = mainTexColor.a * maskTexColor.a;

            // Set the final albedo and alpha, ensuring alpha is clamped between 0 and 1
            o.Albedo = mainTexColor.rgb;
            o.Alpha = saturate(finalAlpha);  // Ensure the alpha remains between 0 and 1
        }
        ENDCG
    }
}


code:
fileFormatVersion: 2
guid: 88b3d14dc3dd60441b1579dd4c5db9ed
ShaderImporter:
  externalObjects: {}
  defaultTextures: []
  nonModifiableTextures: []
  userData:
  assetBundleName: onahole
  assetBundleVariant:


code:
shader "Onahole/InstancedAnimation"
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" { }
        _Color ("Color", Color) = (1, 1, 1, 1) // Default color for instances
        _GridSize ("Grid Size", Float) = 1
    }

    SubShader
    {
        Tags { "RenderType" = "Transparent" "Queue" = "Transparent-100" "PreviewType" = "Plane" }

        // Enable blending for transparency
        Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 3.0
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float _GridSize;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            // Instancing macros for vertex/frag shaders
            UNITY_INSTANCING_BUFFER_START(Props)
            UNITY_DEFINE_INSTANCED_PROP(float, _CurrentFrame)   // Per-instance frame index
            UNITY_DEFINE_INSTANCED_PROP(float4, _Color)         // Per-instance color
            UNITY_INSTANCING_BUFFER_END(Props)

            v2f vert(appdata v)
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_TRANSFER_INSTANCE_ID(v, o);

                // Pass the UV directly to the fragment shader
                o.uv = v.uv;

                // Transform vertex position
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            float4 frag(v2f i) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID(i);

                // Retrieve instanced properties
                float currentFrame = UNITY_ACCESS_INSTANCED_PROP(Props, _CurrentFrame);
                float4 instanceColor = UNITY_ACCESS_INSTANCED_PROP(Props, _Color);

                // Calculate row and column based on current frame and grid size
                float row = _GridSize - 1 - floor(currentFrame / _GridSize);  // Flip the row calculation (Thanks, Direct X)
                float col = fmod(currentFrame, _GridSize);

                // Calculate UV scaling for each frame in the texture atlas grid
                float2 frameUVSize = float2(1.0 / _GridSize, 1.0 / _GridSize);

                // Adjust UVs to sample the correct frame
                float2 uv = i.uv;
                uv = uv * frameUVSize + float2(col, row) * frameUVSize;

                // Sample the texture with the adjusted UVs
                float4 texColor = tex2D(_MainTex, uv) * instanceColor;
                clip(texColor.a - 0.001);
                return texColor;
            }
            ENDCG
        }
    }
}


code:
fileFormatVersion: 2
guid: 0712633f974e9414ca4bb7a0e1b54f2f
ShaderImporter:
  externalObjects: {}
  defaultTextures: []
  nonModifiableTextures: []
  userData:
  assetBundleName: onahole
  assetBundleVariant:


code:
shader "Onahole/InstancedAnimationF16" {
    Properties {
        _MainTex ("Main Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1,1,1,1) // Default color for instances
        _GridSize ("Grid Size", Float) = 4
    }

    SubShader {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" "PreviewType" = "Plane" }
        LOD 200

        // Enable blending for transparency
        Blend SrcAlpha OneMinusSrcAlpha

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 3.0
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float _GridSize;
            float _CurTime;

            // Animation speed (frames per second)
            static const float FPS = 16.0;
            // Time to play each frame
            static const float FrameTime = 1.0 / FPS;

            struct appdata {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            // Instancing macros for vertex/frag shaders
            UNITY_INSTANCING_BUFFER_START(Props)
                UNITY_DEFINE_INSTANCED_PROP(float, _StartTime)     // Per-instance start time
                UNITY_DEFINE_INSTANCED_PROP(float4, _Color)        // Per-instance color
            UNITY_INSTANCING_BUFFER_END(Props)

            v2f vert(appdata v) {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_TRANSFER_INSTANCE_ID(v,o);

                // Pass the UV directly to the fragment shader
                o.uv = v.uv;

                // Transform vertex position
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            float4 frag(v2f i) : SV_Target {
                UNITY_SETUP_INSTANCE_ID(i);

                // Retrieve instanced properties
                float startTime = UNITY_ACCESS_INSTANCED_PROP(Props, _StartTime);
                float4 instanceColor = UNITY_ACCESS_INSTANCED_PROP(Props, _Color);

                // Calculate the elapsed time since the start time
                float elapsedTime = _CurTime - startTime;

                // Determine the current frame based on elapsed time and frame time (FPS)
                float currentFrame = floor(elapsedTime / FrameTime);

                // Calculate row and column based on current frame and grid size
                float row = _GridSize - 1 - floor(currentFrame / _GridSize);  // Flip the row calculation (Thanks, Direct X)
                float col = fmod(currentFrame, _GridSize);

                // Calculate UV scaling for each frame in the texture atlas grid
                float2 frameUVSize = float2(1.0 / _GridSize, 1.0 / _GridSize);

                // Adjust UVs to sample the correct frame
                float2 uv = i.uv;
                uv = uv * frameUVSize + float2(col, row) * frameUVSize;

                // Sample the texture with the adjusted UVs
                float4 texColor = tex2D(_MainTex, uv) * instanceColor;

                return texColor;
            }
            ENDCG
        }
    }
}


code:
fileFormatVersion: 2
guid: 5260d4928d478df489abe04ba89b56e3
ShaderImporter:
  externalObjects: {}
  defaultTextures: []
  nonModifiableTextures: []
  userData:
  assetBundleName: onahole
  assetBundleVariant:


code:
Shader "Custom/InstancedColorShader"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float4 color : COLOR;
                UNITY_VERTEX_OUTPUT_STEREO
            };

            UNITY_INSTANCING_BUFFER_START(Props)
                UNITY_DEFINE_INSTANCED_PROP(float4, _Color)
            UNITY_INSTANCING_BUFFER_END(Props)

            v2f vert(appdata v)
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);

                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = UNITY_ACCESS_INSTANCED_PROP(Props, _Color);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                return i.color;
            }
            ENDCG
        }
    }
}


code:
Shader "Onahole/InvertMaskAlpha" {
    Properties {
        _MainTex ("Main texture", 2D) = "white" {}
        _MaskTex ("Mask texture", 2D) = "white" {}
        _Color ("Color", Vector) = (1,1,1,1)
        _Main_TexOffset ("Main texcoord offset", Vector) = (0,0,0,0)
        _Main_TexScale ("Main texcoord scale", Vector) = (1,1,1,1)
        _Mask_TexOffset ("Mask texcoord offset", Vector) = (0,0,0,0)
        _Mask_TexScale ("Mask texcoord scale", Vector) = (1,1,1,1)
    }

    SubShader {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" }
        LOD 200

        // Enable blending for transparent textures
        Blend SrcAlpha OneMinusSrcAlpha

        CGPROGRAM
        #pragma surface surf Standard alpha:fade
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _MaskTex;
        fixed4 _Color;

        float4 _Main_TexOffset;
        float4 _Main_TexScale;
        float4 _Mask_TexOffset;
        float4 _Mask_TexScale;

        struct Input {
            float2 uv_MainTex;
        };

        // Function to apply scaling, offset, and rotation
        float2 ApplyTransform(float2 uv, float4 offset, float4 scale) {
            // Apply scaling from the center
            uv = (uv - 0.5) / scale.xy + 0.5;

            // Apply offset
            uv += offset.xy;

            return uv;
        }

        void surf(Input IN, inout SurfaceOutputStandard o) {
            // Apply transforms to main texture coordinates
            float2 mainUV = ApplyTransform(IN.uv_MainTex, _Main_TexOffset, _Main_TexScale);

            // Sample main texture with transparency
            fixed4 mainTexColor = tex2D(_MainTex, mainUV) * _Color;

            // Apply transforms to mask texture coordinates
            float2 maskUV = ApplyTransform(IN.uv_MainTex, _Mask_TexOffset, _Mask_TexScale);

            // Sample mask texture
            fixed4 maskTexColor = tex2D(_MaskTex, maskUV);

            // Subtract the mask's alpha channel from the main texture's alpha channel
            float finalAlpha = mainTexColor.a - maskTexColor.a;

            // Set the final albedo and alpha, ensuring alpha is clamped between 0 and 1
            o.Albedo = mainTexColor.rgb;
            o.Alpha = saturate(finalAlpha);  // Ensure the alpha remains between 0 and 1
        }
        ENDCG
    }
}


code:
fileFormatVersion: 2
guid: 9acc1486e1cd91a4b98369ac00fa440c
ShaderImporter:
  externalObjects: {}
  defaultTextures: []
  nonModifiableTextures: []
  userData:
  assetBundleName: onahole
  assetBundleVariant:


code:
Shader "Onahole/SimpleAlpha"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Main Color", Color) = (1,1,1,1)
    }

    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" "PreviewType" = "Plane"}

        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            sampler2D _MainTex;
            float4 _Color;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : POSITION;
                float2 uv : TEXCOORD0;
            };

            // Vertex shader
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);  // Convert object space to clip space
                o.uv = v.uv;  // Pass the UV coordinates to the fragment shader
                return o;
            }

            // Fragment (pixel) shader
            fixed4 frag (v2f i) : SV_Target
            {
                // Sample the texture with transparency
                fixed4 texColor = tex2D(_MainTex, i.uv)* _Color;
                clip(texColor.a - 0.001);
                return texColor;
            }
            ENDCG
        }
    }
}


code:
fileFormatVersion: 2
guid: c92cfd096e107ef48ad9a52e97b512f3
ShaderImporter:
  externalObjects: {}
  defaultTextures: []
  nonModifiableTextures: []
  userData:
  assetBundleName: onahole
  assetBundleVariant:


code:
<?xml version="1.0" encoding="utf-8"?>
<Defs>
  <AnimationDef>
    <defName>Use_Onahole_Anal_User</defName>
    <durationTicks>55</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0.5)</offset>
              <rotation>South</rotation>

              <tick>5</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0.6)</offset>
              <rotation>South</rotation>

              <tick>30</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0.65)</offset>
              <rotation>South</rotation>
              <sound>Slimy</sound>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0.5)</offset>
              <rotation>South</rotation>
              <sound>Fuck</sound>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

          </keyframes>
        </value>

        <key>RimNude_Penis</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>180</angle>
              <visible>true</visible>
              <offset>(0, -0.603846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
  <AnimationDef>
    <defName>Use_Onahole_Anal_Used</defName>
    <durationTicks>55</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0)</offset>
              <rotation>South</rotation>

              <tick>5</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0.03)</offset>
              <rotation>South</rotation>
              <voice>Moan</voice>

              <tick>25</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0.1)</offset>
              <rotation>South</rotation>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

              <tick>30</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8"?>
<Defs>
  <AnimationDef>
    <defName>Use_Onahole_Cunnilingus_User</defName>
    <durationTicks>55</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, 0, -0.5)</offset>
              <rotation>North</rotation>

              <tick>5</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, 0, -0.45)</offset>
              <rotation>North</rotation>

              <tick>30</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, 0, -0.43)</offset>
              <rotation>North</rotation>
              <sound>Slimy</sound>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, 0, -0.5)</offset>
              <rotation>North</rotation>
              <sound>Fuck</sound>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>North</rotation>

          </keyframes>
        </value>

        <key>RimNude_Penis</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>180</angle>
              <visible>true</visible>
              <offset>(0, -0.603846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
  <AnimationDef>
    <defName>Use_Onahole_Cunnilingus_Used</defName>
    <durationTicks>55</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0)</offset>
              <rotation>South</rotation>

              <tick>5</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0.03)</offset>
              <rotation>South</rotation>
              <voice>Moan</voice>

              <tick>25</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0.05)</offset>
              <rotation>South</rotation>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

              <tick>30</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8"?>
<Defs>
  <AnimationDef>
    <defName>Use_Onahole_Fingering_User</defName>
    <durationTicks>55</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, 0, 0)</offset>
              <rotation>North</rotation>

              <tick>5</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, 0, 0.1)</offset>
              <rotation>North</rotation>

              <tick>30</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, 0, 0.15)</offset>
              <rotation>North</rotation>
              <sound>Slimy</sound>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, 0, 0)</offset>
              <rotation>North</rotation>
              <sound>Fuck</sound>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>North</rotation>

          </keyframes>
        </value>

        <key>RimNude_Penis</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>180</angle>
              <visible>true</visible>
              <offset>(0, -0.603846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
  <AnimationDef>
    <defName>Use_Onahole_Fingering_Used</defName>
    <durationTicks>55</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0)</offset>
              <rotation>South</rotation>

              <tick>5</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0.03)</offset>
              <rotation>South</rotation>
              <voice>Moan</voice>

              <tick>25</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0.1)</offset>
              <rotation>South</rotation>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

              <tick>30</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8"?>
<Defs>

  <AnimationDef>
    <defName>Use_Onahole_Oral_User</defName>
    <durationTicks>60</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>-19</angle>
              <visible>true</visible>
              <offset>(-0.48, -1.153846, 0.88)</offset>
              <rotation>East</rotation>

              <tick>5</tick>
              <angle>-32</angle>
              <visible>true</visible>
              <offset>(-0.48, -1.153846, 0.88)</offset>
              <rotation>East</rotation>

              <tick>30</tick>
              <angle>-35</angle>
              <visible>true</visible>
              <offset>(-0.48, -1.153846, 0.88)</offset>
              <rotation>East</rotation>
              <voice>Moan</voice>

              <tick>60</tick>
              <angle>-19</angle>
              <visible>true</visible>
              <offset>(-0.48, -1.153846, 0.88)</offset>
              <rotation>East</rotation>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>31</angle>
              <visible>true</visible>
              <rotation>East</rotation>

              <tick>30</tick>
              <angle>35</angle>
              <visible>true</visible>
              <rotation>East</rotation>

              <tick>60</tick>
              <angle>31</angle>
              <visible>true</visible>
              <rotation>East</rotation>

          </keyframes>
        </value>

        <key>RimNude_Penis</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>14</angle>
              <offset>(0, -1.153846, 0)</offset>
              <visible>true</visible>
              <rotation>East</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
  <AnimationDef>
    <defName>Use_Onahole_Oral_Used</defName>
    <durationTicks>60</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0)</offset>
              <rotation>South</rotation>

              <tick>5</tick>
              <angle>5</angle>
              <visible>true</visible>
              <offset>(0.02, -1.103846, 0)</offset>
              <rotation>South</rotation>
              <voice>Moan</voice>

              <tick>25</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0.05, -1.103846, 0)</offset>
              <rotation>South</rotation>

              <tick>60</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(-0.08, 0, -0.05)</offset>
              <rotation>West</rotation>

              <tick>5</tick>
              <angle>-8</angle>
              <visible>true</visible>
              <offset>(-0.03, 0, 0.03)</offset>
              <rotation>West</rotation>

              <tick>30</tick>
              <angle>-10</angle>
              <visible>true</visible>
              <offset>(-0.05, 0, 0.00)</offset>
              <rotation>West</rotation>

              <tick>60</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(-0.08, 0, -0.05)</offset>
              <rotation>West</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8"?>
<Defs>
  <AnimationDef>
    <defName>Use_Onahole_Reverse_Rimming_User</defName>
    <durationTicks>55</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, -0.2)</offset>
              <rotation>South</rotation>

              <tick>5</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, -0.15)</offset>
              <rotation>South</rotation>

              <tick>30</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, -0.05)</offset>
              <rotation>South</rotation>
              <sound>Slimy</sound>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, -0.2)</offset>
              <rotation>South</rotation>
              <sound>Fuck</sound>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

          </keyframes>
        </value>

        <key>RimNude_Penis</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>180</angle>
              <visible>true</visible>
              <offset>(0, -0.603846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
  <AnimationDef>
    <defName>Use_Onahole_Reverse_Rimming_Used</defName>
    <durationTicks>55</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0)</offset>
              <rotation>South</rotation>

              <tick>5</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0.03)</offset>
              <rotation>South</rotation>
              <voice>Moan</voice>

              <tick>25</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0.1)</offset>
              <rotation>South</rotation>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

              <tick>30</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8"?>
<Defs>

  <AnimationDef>
    <defName>Use_Onahole_Rimming_User</defName>
    <durationTicks>60</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>-19</angle>
              <visible>true</visible>
              <offset>(-0.48, -1.153846, 0.88)</offset>
              <rotation>West</rotation>

              <tick>5</tick>
              <angle>-32</angle>
              <visible>true</visible>
              <offset>(-0.48, -1.153846, 0.88)</offset>
              <rotation>West</rotation>

              <tick>30</tick>
              <angle>-35</angle>
              <visible>true</visible>
              <offset>(-0.48, -1.153846, 0.88)</offset>
              <rotation>West</rotation>
              <voice>Moan</voice>

              <tick>60</tick>
              <angle>-19</angle>
              <visible>true</visible>
              <offset>(-0.48, -1.153846, 0.88)</offset>
              <rotation>West</rotation>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>31</angle>
              <visible>true</visible>
              <rotation>West</rotation>

              <tick>30</tick>
              <angle>35</angle>
              <visible>true</visible>
              <rotation>West</rotation>

              <tick>60</tick>
              <angle>31</angle>
              <visible>true</visible>
              <rotation>West</rotation>

          </keyframes>
        </value>

        <key>RimNude_Penis</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>14</angle>
              <offset>(0, -1.153846, 0)</offset>
              <visible>true</visible>
              <rotation>East</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
  <AnimationDef>
    <defName>Use_Onahole_Rimming_Used</defName>
    <durationTicks>60</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0)</offset>
              <rotation>South</rotation>

              <tick>5</tick>
              <angle>5</angle>
              <visible>true</visible>
              <offset>(0.02, -1.103846, 0)</offset>
              <rotation>South</rotation>
              <voice>Moan</voice>

              <tick>25</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0.05, -1.103846, 0)</offset>
              <rotation>South</rotation>

              <tick>60</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(-0.08, 0, -0.05)</offset>
              <rotation>West</rotation>

              <tick>5</tick>
              <angle>-8</angle>
              <visible>true</visible>
              <offset>(-0.03, 0, 0.03)</offset>
              <rotation>West</rotation>

              <tick>30</tick>
              <angle>-10</angle>
              <visible>true</visible>
              <offset>(-0.05, 0, 0.00)</offset>
              <rotation>West</rotation>

              <tick>60</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(-0.08, 0, -0.05)</offset>
              <rotation>West</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8"?>
<Defs>
  <AnimationDef>
    <defName>Use_Onahole_Vaginal_User</defName>
    <durationTicks>55</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>180</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, -0.6)</offset>
              <rotation>South</rotation>

              <tick>5</tick>
              <angle>180</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, -0.4)</offset>
              <rotation>South</rotation>

              <tick>30</tick>
              <angle>180</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, -0.35)</offset>
              <rotation>South</rotation>
              <sound>Slimy</sound>

              <tick>55</tick>
              <angle>180</angle>
              <visible>true</visible>
              <offset>(0, -1.153846, -0.6)</offset>
              <rotation>South</rotation>
              <sound>Fuck</sound>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

          </keyframes>
        </value>

        <key>RimNude_Penis</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>180</angle>
              <visible>true</visible>
              <offset>(0, -0.603846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
  <AnimationDef>
    <defName>Use_Onahole_Vaginal_Used</defName>
    <durationTicks>55</durationTicks>
    <animationParts>

        <key>Root</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0)</offset>
              <rotation>South</rotation>

              <tick>5</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0.03)</offset>
              <rotation>South</rotation>
              <voice>Moan</voice>

              <tick>25</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0.1)</offset>
              <rotation>South</rotation>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <offset>(0, -1.103846, 0)</offset>
              <rotation>South</rotation>

          </keyframes>
        </value>

        <key>Head</key>
        <value>
          <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
          <keyframes>

              <tick>0</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

              <tick>30</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

              <tick>55</tick>
              <angle>0</angle>
              <visible>true</visible>
              <rotation>South</rotation>

          </keyframes>
        </value>

    </animationParts>
  </AnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8"?>
<Defs>
	<Rimworld_Animations.GroupAnimationDef>
		<defName>GroupAnimation_Use_Onahole_Anal</defName>
		<numActors>2</numActors>
		<animationStages>

				<loops>40</loops>
				<loopOptions>

						<probability>1</probability>
						<animationDefs>

Use_Onahole_Anal_User

Use_Onahole_Anal_Used

						</animationDefs>

				</loopOptions>

		</animationStages>

		<contexts>

				<whitelist>

				</whitelist>
				<priority>99999</priority>
				<interactionDefs>

Sex_Anal

Rape_Anal

				</interactionDefs>

		</contexts>

	</Rimworld_Animations.GroupAnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<Rimworld_Animations.GroupAnimationDef>
		<defName>GroupAnimation_Use_Onahole_Cunnilingus</defName>
		<numActors>2</numActors>
		<animationStages>

				<loops>40</loops>
				<loopOptions>

						<probability>1</probability>
						<animationDefs>

Use_Onahole_Cunnilingus_User

Use_Onahole_Cunnilingus_Used

						</animationDefs>

				</loopOptions>

		</animationStages>

		<contexts>

				<whitelist>

				</whitelist>
				<priority>99999</priority>
				<interactionDefs>

Sex_Reverse_Cunnilingus

Rape_Reverse_Cunnilingus

				</interactionDefs>

		</contexts>

	</Rimworld_Animations.GroupAnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<Rimworld_Animations.GroupAnimationDef>
		<defName>GroupAnimation_Use_Onahole_Fingering</defName>
		<numActors>2</numActors>
		<animationStages>

				<loops>40</loops>
				<loopOptions>

						<probability>1</probability>
						<animationDefs>

Use_Onahole_Fingering_User

Use_Onahole_Fingering_Used

						</animationDefs>

				</loopOptions>

		</animationStages>

		<contexts>

				<whitelist>

				</whitelist>
				<priority>99999</priority>
				<interactionDefs>

Rape_Reverse_Fingering

Sex_Reverse_Fingering

Rape_Fisting

Sex_Fisting

Rape_Breastjob

				</interactionDefs>

		</contexts>

	</Rimworld_Animations.GroupAnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<Rimworld_Animations.GroupAnimationDef>
		<defName>GroupAnimation_Use_Onahole_Oral</defName>
		<numActors>2</numActors>
		<animationStages>

				<loops>40</loops>
				<loopOptions>

						<probability>1</probability>
						<animationDefs>

Use_Onahole_Oral_User

Use_Onahole_Oral_Used

						</animationDefs>

				</loopOptions>

		</animationStages>

		<contexts>

				<whitelist>

				</whitelist>
				<priority>99999</priority>
				<interactionDefs>

Rape_Fellatio

Sex_Fellatio

Rape_Cunnilingus

Sex_Cunnilingus

				</interactionDefs>

		</contexts>

	</Rimworld_Animations.GroupAnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<Rimworld_Animations.GroupAnimationDef>
		<defName>GroupAnimation_Use_Onahole_Reverse_Rimming</defName>
		<numActors>2</numActors>
		<animationStages>

				<loops>40</loops>
				<loopOptions>

						<probability>1</probability>
						<animationDefs>

Use_Onahole_Reverse_Rimming_User

Use_Onahole_Reverse_Rimming_Used

						</animationDefs>

				</loopOptions>

		</animationStages>

		<contexts>

				<whitelist>

				</whitelist>
				<priority>99999</priority>
				<interactionDefs>

Rape_Reverse_Rimming

Rape_Reverse_Rimming

				</interactionDefs>

		</contexts>

	</Rimworld_Animations.GroupAnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<Rimworld_Animations.GroupAnimationDef>
		<defName>GroupAnimation_Use_Onahole_Rimming</defName>
		<numActors>2</numActors>
		<animationStages>

				<loops>40</loops>
				<loopOptions>

						<probability>1</probability>
						<animationDefs>

Use_Onahole_Rimming_User

Use_Onahole_Rimming_Used

						</animationDefs>

				</loopOptions>

		</animationStages>

		<contexts>

				<whitelist>

				</whitelist>
				<priority>99999</priority>
				<interactionDefs>

Rape_Rimming

Sex_Rimming

				</interactionDefs>

		</contexts>

	</Rimworld_Animations.GroupAnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<Rimworld_Animations.GroupAnimationDef>
		<defName>GroupAnimation_Use_Onahole_Universal</defName>
		<numActors>2</numActors>
		<animationStages>

				<loops>40</loops>
				<loopOptions>

						<probability>1</probability>
						<animationDefs>

Use_Onahole_Fingering_User

Use_Onahole_Fingering_Used

						</animationDefs>

				</loopOptions>

		</animationStages>

		<contexts>

				<priority>9999</priority>

		</contexts>

	</Rimworld_Animations.GroupAnimationDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<Rimworld_Animations.GroupAnimationDef>
		<defName>GroupAnimation_Use_Onahole_Vaginal</defName>
		<numActors>2</numActors>
		<animationStages>

				<loops>40</loops>
				<loopOptions>

						<probability>1</probability>
						<animationDefs>

Use_Onahole_Vaginal_User

Use_Onahole_Vaginal_Used

						</animationDefs>

				</loopOptions>

		</animationStages>

		<contexts>

				<whitelist>

				</whitelist>
				<priority>99999</priority>
				<interactionDefs>

Sex_Vaginal

Rape_Vaginal

Rape_Reverse_Scissoring

				</interactionDefs>

		</contexts>

	</Rimworld_Animations.GroupAnimationDef>
</Defs>


code:
<Patch>
    <!-- Use onahole class-->
    <Operation Class="PatchOperationReplace">
        <xpath>Defs/ThingDef[defName="DDJY_BaseBondageBed"]/thingClass</xpath>
        <value>
            <thingClass>RJW_Onahole.Building_OnaholeBed</thingClass>
        </value>
    </Operation>
    <!-- Prevent AI destory this-->
    <Operation Class="PatchOperationAdd">
        <xpath>Defs/ThingDef[defName="DDJY_BaseBondageBed"]</xpath>
        <value>
            <building>
                <ai_neverTrashThis>true</ai_neverTrashThis>
            </building>
        </value>
    </Operation>

</Patch>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<FleckDef ParentName="FleckBase_Thrown">
		<defName>Onahole_ShowerVapor</defName>
		<graphicData>
			<texPath>Onahole/Things/Mote/Onahole_ShowerVapor</texPath>
			<shaderType>Mote</shaderType>
		</graphicData>
		<altitudeLayer>Gas</altitudeLayer>
		<fadeInTime>0.5</fadeInTime>
		<solidTime>0</solidTime>
		<fadeOutTime>0.5</fadeOutTime>
	</FleckDef>
</Defs>


code:
<Patch>

    <Operation Class="PatchOperationAdd">
        <xpath>
            Defs/ThingDef[defName="Building_BaseOnaholeBed"]/comps</xpath>
        <value>

                <mode>Sewage</mode>

        </value>
    </Operation>
    <Operation Class="PatchOperationAdd">
        <xpath>
            Defs/ThingDef[defName="Building_BaseOnaholeBed"]/comps</xpath>
        <value>

                <compClass>RJW_Onahole.Comps.CompShower</compClass>
                <altitudeLayer>BuildingOnTop</altitudeLayer>
                <graphicDatas>

                        <texPath>Onahole/Buildings/Shower</texPath>
                        <graphicClass>Graphic_Single</graphicClass>
                        <drawOffset>(0,0,0.9)</drawOffset>
                        <drawSize>(1.8,1.8)</drawSize>

                        <texPath>Onahole/Buildings/ShowerHead</texPath>
                        <graphicClass>Graphic_Single</graphicClass>
                        <drawOffset>(0,0,0.9)</drawOffset>
                        <drawSize>(1.8,1.8)</drawSize>

                </graphicDatas>
                <animatedTextureGroups>

                        Shower
                        <animateMode>Loop</animateMode>
                        <groupOffset>(0,2,0.9)</groupOffset>
                        <animatedTextures>

                                <texPath>Onahole/Buildings/ShowerOn0</texPath>
                                <graphicClass>Graphic_Single</graphicClass>
                                <drawSize>(1.8,1.8)</drawSize>
                                <shaderType>Transparent</shaderType>

                                <texPath>Onahole/Buildings/ShowerOn1</texPath>
                                <graphicClass>Graphic_Single</graphicClass>
                                <drawSize>(1.8,1.8)</drawSize>
                                <shaderType>Transparent</shaderType>

                        </animatedTextures>

                </animatedTextureGroups>

        </value>
    </Operation>

</Patch>


code:
<Defs>
    <rjw.SexFluidDef>
        <defName>Blood</defName>
        <label>blood</label>
        <filth>Filth_Blood</filth>
		<consumable>HemogenPack</consumable>
        <consumableFluidRatio>0.01</consumableFluidRatio>
    </rjw.SexFluidDef>
</Defs>


code:
<Defs>
    <!-- Treat mixtures as cum-->
    <RJW_Onahole.Data.FilthToSexFluidDef>
        <defName>FilthMixture</defName>
        <sexFluid>Cum</sexFluid>
    </RJW_Onahole.Data.FilthToSexFluidDef>
</Defs>


code:
<Defs>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Yuran_Race</defName>
        <x>0.4772727</x>
        <z>0.7045454</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Yuran_Race_Miko</defName>
        <x>0.4772727</x>
        <z>0.7045454</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Yuran_Race_Miko_Blacksnake</defName>
        <x>0.4772727</x>
        <z>0.7045454</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Axolotl</defName>
        <x>0.1363636</x>
        <z>0.1363636</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Kiiro_Race</defName>
        <x>0.2272727</x>
        <z>0.4772727</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Milira_Race</defName>
        <x>0.3977273</x>
        <z>0.3977273</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Dragonian_Race</defName>
        <x>0.4431818</x>
        <z>1</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Rabbie</defName>
        <x>0.5909091</x>
        <z>0.6704546</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Ratkin</defName>
        <x>0.7613636</x>
        <z>0.625</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Maru</defName>
        <x>0.3636364</x>
        <z>0.2840909</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Kurin_Race</defName>
        <x>0.5568182</x>
        <z>0.625</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Alien_Miho</defName>
        <x>0.3977273</x>
        <z>0.5454546</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Human</defName>
        <x>0.5568182</x>
        <z>0.875</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Tinimar_Race</defName>
        <x>0.4545455</x>
        <z>0.3636364</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
    <RJW_Onahole.Data.SA0ScaleDataDef>
        <defName>Tinimar_Race_grey</defName>
        <x>0.4545455</x>
        <z>0.3636364</z>
    </RJW_Onahole.Data.SA0ScaleDataDef>
</Defs>


code:
<Patch>
    <Operation Class="PatchOperationAdd">
        <xpath>
            Defs/ThingDef[@Name="BasePawn"]/comps
        </xpath>
        <value>

        </value>
    </Operation>
</Patch>


code:
<Patch>

    <Operation Class="PatchOperationInsert">
        <xpath>
            Defs/ThinkTreeDef[defName="Humanlike"]/thinkRoot[@Class="ThinkNode_Priority"]/subNodes/li[insertTag="Humanlike_PostDuty"]</xpath>
        <value>

                <mtbHours>0.5</mtbHours>
                <subNodes>

                </subNodes>

        </value>
    </Operation>

    <Operation Class="PatchOperationInsert">
        <xpath>
            Defs/ThinkTreeDef[defName="Humanlike"]/thinkRoot[@Class="ThinkNode_Priority"]/subNodes/li[insertTag="Humanlike_PostMentalState"]</xpath>
        <value>

                <invert>true</invert>
                <subNodes>

                        <mtbHours>0.5</mtbHours>
                        <subNodes>

                        </subNodes>

                </subNodes>

        </value>
    </Operation>

    <Operation Class="PatchOperationInsert">
        <xpath>Defs/ThinkTreeDef[defName="Animal"]/thinkRoot/subNodes/li[insertTag="Animal_PreMain"]</xpath>
        <value>

                <subNodes>

                </subNodes>

        </value>
    </Operation>
    <Operation Class="PatchOperationInsert">
        <xpath>
            Defs/ThinkTreeDef[defName="Animal"]/thinkRoot/subNodes/li[@Class="ThinkNode_QueuedJob"]</xpath>
        <value>

                <subNodes>

                        <subNodes>

                        </subNodes>

                </subNodes>

        </value>
    </Operation>

    <Operation Class="PatchOperationInsert">
        <xpath>Defs/ThinkTreeDef/thinkRoot/subNodes/li/subNodes/li/subNodes/li[@Class="ThinkNode_ConditionalWorkMode"]/subNodes/li[@Class="JobGiver_Work"
            and ./emergency="true"]</xpath>
        <order>Append</order>
        <value>

                <subNodes>

                </subNodes>

        </value>
    </Operation>
</Patch>


code:
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RJW_Onahole", "Source\RJW_Onahole\RJW_Onahole.csproj", "{FC1C463E-E5F3-4D74-BC7E-59058A0F4B37}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RJW_Animation", "Source\RJW_Animation\RJW_Animation.csproj", "{05708341-0726-426E-A30B-2CBC0C9A6F09}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RJW_Menstruation", "Source\RJW_Menstruation\RJW_Menstruation.csproj", "{61889A12-E964-4519-A624-5663C5BD72AF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BondageBed", "Source\BondageBed\BondageBed.csproj", "{DEC8516E-0E1F-4BF1-8210-0973366A1B1A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HAR", "Source\HAR\HAR.csproj", "{54FB6A89-83FD-4A2E-BEC7-8DB2BB7714A3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RJW_SizedApparel", "Source\RJW_SizedApparel\RJW_SizedApparel.csproj", "{78890B0E-4F3B-4D0C-9A89-0F4BC514B235}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RJW_BrothelColony", "Source\RJW_BrothelColony\RJW_BrothelColony.csproj", "{C24318A7-B857-4BBC-9F4E-61BACFDF8C3C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DubsBadHygiene", "Source\DubsBadHygiene\DubsBadHygiene.csproj", "{F2C2979D-81B5-47F2-B5B3-4F8DB31D13D1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FacialAnimation", "Source\FacialAnimation\FacialAnimation.csproj", "{1DABB79E-0E93-4ED3-A1BA-4C69B8777C89}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PipeNetwork", "Source\PipeNetwork\PipeNetwork.csproj", "{8A326640-8397-48E1-AE1E-01AB5C31BD84}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RimNudeWorld", "Source\RimNudeWorld\RimNudeWorld.csproj", "{B0FA1E37-8F85-427F-B35C-8A01A600C9E1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cumpilation", "Source\Cumpilation\Cumpilation.csproj", "{3D0E94C7-669A-48FD-A600-85103A5C5270}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sexperience_Ideo", "Source\Sexperience_Ideo\Sexperience_Ideo.csproj", "{E07C8C58-3358-4A7F-87D5-6968173CBC54}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Privacy", "Source\Privacy\Privacy.csproj", "{750DFF09-275D-409A-BF03-1502573B60E5}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{FC1C463E-E5F3-4D74-BC7E-59058A0F4B37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{FC1C463E-E5F3-4D74-BC7E-59058A0F4B37}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{FC1C463E-E5F3-4D74-BC7E-59058A0F4B37}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{FC1C463E-E5F3-4D74-BC7E-59058A0F4B37}.Release|Any CPU.Build.0 = Release|Any CPU
		{05708341-0726-426E-A30B-2CBC0C9A6F09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{05708341-0726-426E-A30B-2CBC0C9A6F09}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{05708341-0726-426E-A30B-2CBC0C9A6F09}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{05708341-0726-426E-A30B-2CBC0C9A6F09}.Release|Any CPU.Build.0 = Release|Any CPU
		{61889A12-E964-4519-A624-5663C5BD72AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{61889A12-E964-4519-A624-5663C5BD72AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{61889A12-E964-4519-A624-5663C5BD72AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{61889A12-E964-4519-A624-5663C5BD72AF}.Release|Any CPU.Build.0 = Release|Any CPU
		{DEC8516E-0E1F-4BF1-8210-0973366A1B1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{DEC8516E-0E1F-4BF1-8210-0973366A1B1A}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{DEC8516E-0E1F-4BF1-8210-0973366A1B1A}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{DEC8516E-0E1F-4BF1-8210-0973366A1B1A}.Release|Any CPU.Build.0 = Release|Any CPU
		{54FB6A89-83FD-4A2E-BEC7-8DB2BB7714A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{54FB6A89-83FD-4A2E-BEC7-8DB2BB7714A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{54FB6A89-83FD-4A2E-BEC7-8DB2BB7714A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{54FB6A89-83FD-4A2E-BEC7-8DB2BB7714A3}.Release|Any CPU.Build.0 = Release|Any CPU
		{78890B0E-4F3B-4D0C-9A89-0F4BC514B235}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{78890B0E-4F3B-4D0C-9A89-0F4BC514B235}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{78890B0E-4F3B-4D0C-9A89-0F4BC514B235}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{78890B0E-4F3B-4D0C-9A89-0F4BC514B235}.Release|Any CPU.Build.0 = Release|Any CPU
		{C24318A7-B857-4BBC-9F4E-61BACFDF8C3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{C24318A7-B857-4BBC-9F4E-61BACFDF8C3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{C24318A7-B857-4BBC-9F4E-61BACFDF8C3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{C24318A7-B857-4BBC-9F4E-61BACFDF8C3C}.Release|Any CPU.Build.0 = Release|Any CPU
		{F2C2979D-81B5-47F2-B5B3-4F8DB31D13D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{F2C2979D-81B5-47F2-B5B3-4F8DB31D13D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{F2C2979D-81B5-47F2-B5B3-4F8DB31D13D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{F2C2979D-81B5-47F2-B5B3-4F8DB31D13D1}.Release|Any CPU.Build.0 = Release|Any CPU
		{1DABB79E-0E93-4ED3-A1BA-4C69B8777C89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{1DABB79E-0E93-4ED3-A1BA-4C69B8777C89}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{1DABB79E-0E93-4ED3-A1BA-4C69B8777C89}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{1DABB79E-0E93-4ED3-A1BA-4C69B8777C89}.Release|Any CPU.Build.0 = Release|Any CPU
		{8A326640-8397-48E1-AE1E-01AB5C31BD84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{8A326640-8397-48E1-AE1E-01AB5C31BD84}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{8A326640-8397-48E1-AE1E-01AB5C31BD84}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{8A326640-8397-48E1-AE1E-01AB5C31BD84}.Release|Any CPU.Build.0 = Release|Any CPU
		{B0FA1E37-8F85-427F-B35C-8A01A600C9E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{B0FA1E37-8F85-427F-B35C-8A01A600C9E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{B0FA1E37-8F85-427F-B35C-8A01A600C9E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{B0FA1E37-8F85-427F-B35C-8A01A600C9E1}.Release|Any CPU.Build.0 = Release|Any CPU
		{3D0E94C7-669A-48FD-A600-85103A5C5270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{3D0E94C7-669A-48FD-A600-85103A5C5270}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{3D0E94C7-669A-48FD-A600-85103A5C5270}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{3D0E94C7-669A-48FD-A600-85103A5C5270}.Release|Any CPU.Build.0 = Release|Any CPU
		{E07C8C58-3358-4A7F-87D5-6968173CBC54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{E07C8C58-3358-4A7F-87D5-6968173CBC54}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{E07C8C58-3358-4A7F-87D5-6968173CBC54}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{E07C8C58-3358-4A7F-87D5-6968173CBC54}.Release|Any CPU.Build.0 = Release|Any CPU
		{750DFF09-275D-409A-BF03-1502573B60E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{750DFF09-275D-409A-BF03-1502573B60E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{750DFF09-275D-409A-BF03-1502573B60E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{750DFF09-275D-409A-BF03-1502573B60E5}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
EndGlobal


code:
using System;
using RimWorld;
using UnityEngine;
using UnityEngine.PlayerLoop;
using HarmonyLib;
using Verse;
using DDJY_BED;
using System.Linq;
using System.Collections.Generic;
using RJW_Onahole.Comps;

namespace RJW_Onahole
{
    [StaticConstructorOnStartup]
    public static class BondageBed
    {
        public static Harmony Harmony = new Harmony(nameof(RJW_Onahole) + nameof(BondageBed));
        public static RJW_Onahole_Settings Settings;
        static BondageBed()
        {
            Harmony.PatchAll();
            List<CompProperties> comps = new List<CompProperties>();
            foreach (ThingDef x in DefDatabase<ThingDef>.AllDefs.Where((x) => x.comps.Any((y) => y.compClass == typeof(CompOnaholeBed))))
            {
                foreach (CompProperties y in x.comps)
                {
                    if (y.GetType() == typeof(CompProperties_OnaholeChains) || y.GetType() == typeof(CompProperties_ExtraGraphics))
                    {
                        continue;
                    }
                    comps.Add(y);
                }
                break;
            }
            foreach (ThingDef bondageBedDef in DefDatabase<ThingDef>.AllDefs.Where((x) => x.HasComp<CompEffectBondageBed>()))
            {
                // Set drawer type to RealtimeOnly, Allow graphics to be updated
                bondageBedDef.drawerType = DrawerType.RealtimeOnly;
                // Implement offset properly without layer extension
                foreach (CompProperties_LayerExtension y in bondageBedDef.comps.Where((y) => y is CompProperties_LayerExtension).Cast<CompProperties_LayerExtension>())
                {
                    if (y.pawnDrawOffset == null)
                    {
                        continue;
                    }
                    bondageBedDef.building.bed_pawnDrawOffset = -y.pawnDrawOffset.drawOffset.z;
                    y.pawnDrawOffset = null;
                }
                // Add all Onahole bed comps to bondage bed
                bondageBedDef.comps = comps;
            }
        }

    }
    [HarmonyPatch(typeof(CompOnaholeBed))]
    public static class CompOnaholeBed_Patch
    {
        [HarmonyPostfix]
        [HarmonyPatch("Notify_PawnUnbind")]
        public static void Notify_PawnUnbind_Postfix(Pawn pawn)
        {
            HediffDef hediffBed = DDJY_HediffDefOf.DDJY_Hediff_BondageBed;
            IEnumerable<Hediff> allHediffs = new List<Hediff>(pawn.health.hediffSet.hediffs);
            foreach (Hediff hediff in allHediffs)
            {
                if (hediff.def == hediffBed)
                {
                    pawn.health.RemoveHediff(hediff);
                }
            }
        }
    }
}


code:
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net48</TargetFramework>
    <AssemblyName>Onahole_BondageBed</AssemblyName>
  </PropertyGroup>

  <PropertyGroup>
    <DebugType>none</DebugType>
    <Optimize>true</Optimize>
    <OutDir>../../Mods/BondageBed/Assemblies/</OutDir>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>3</WarningLevel>
    <Prefer32Bit>false</Prefer32Bit>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="0Harmony">
      <HintPath>../../Libs/0Harmony.dll</HintPath>
      <Private>False</Private>
    </Reference>

    <Reference Include="RJW">
      <HintPath>../../Libs/RJW.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="DDJY_BED">
      <HintPath>../../Libs/DDJY_BED.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <!-- The main game code (RimWorld and Verse) -->
    <Reference Include="mscorlib">
      <HintPath>../../RimWorld_Data/Managed/mscorlib.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="Assembly-CSharp">
      <HintPath>../../RimWorld_Data/Managed/Assembly-CSharp.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine">
      <HintPath>../../RimWorld_Data/Managed/UnityEngine.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.CoreModule">
      <HintPath>../../RimWorld_Data/Managed/UnityEngine.CoreModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.TextRenderingModule">
      <HintPath>../../RimWorld_Data/Managed/UnityEngine.TextRenderingModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.IMGUIModule">
      <HintPath>../../RimWorld_Data/Managed/UnityEngine.IMGUIModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\RJW_Onahole\RJW_Onahole.csproj">
      <Private>false</Private>
    </ProjectReference>
  </ItemGroup>
</Project>


code:
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net48</TargetFramework>
    <AssemblyName>Onahole_Cumpilation</AssemblyName>
  </PropertyGroup>

  <!-- Release build -->
  <PropertyGroup>
    <DebugType>none</DebugType>
    <Optimize>true</Optimize>
    <OutDir>../../Mods/Cumpilation/Assemblies/</OutDir>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>3</WarningLevel>
    <Prefer32Bit>false</Prefer32Bit>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="0Harmony">
      <HintPath>../../Libs/0Harmony.dll</HintPath>
      <Private>False</Private>
    </Reference>

    <Reference Include="Cumpilation">
      <HintPath>../../Libs/Cumpilation.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="RJW">
      <HintPath>../../Libs/RJW.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <!-- The main game code (RimWorld and Verse) -->
     <Reference Include="mscorlib">
      <HintPath>../../RimWorld_Data/Managed/mscorlib.dll</HintPath>
      <Private>False</Private>
     </Reference>
    <Reference Include="Assembly-CSharp">
      <HintPath>../../RimWorld_Data/Managed/Assembly-CSharp.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine">
      <HintPath>../../RimWorld_Data/Managed/UnityEngine.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.CoreModule">
      <HintPath>../../RimWorld_Data/Managed/UnityEngine.CoreModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.TextRenderingModule">
      <HintPath>../../RimWorld_Data/Managed/UnityEngine.TextRenderingModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.IMGUIModule">
      <HintPath>../../RimWorld_Data/Managed/UnityEngine.IMGUIModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\RJW_Onahole\RJW_Onahole.csproj">
      <Private>false</Private>
    </ProjectReference>
  </ItemGroup>
</Project>


code:
using HarmonyLib;
using System;
using System.Collections.Generic;
using RimWorld;
using Verse;
using rjw;
using RJW_Onahole.Hediffs;
using System.Reflection;
using RJW_Onahole.Utilities;
using UnityEngine;
using System.Reflection.Emit;
using RJW_Onahole.Comps;
using Cumpilation.Leaking;
using Cumpilation.Gathering;
using System.Linq;

namespace RJW_Onahole
{
    [StaticConstructorOnStartup]
    public static class DefPatch
    {
        static DefPatch()
        {
            // Add the cum fluid product
            SexFluidDef sexFluidDef = DefDatabase<SexFluidDef>.GetNamed("Cum");
            sexFluidDef.baseNutrition = 0f;
            sexFluidDef.consumable = DefDatabase<ThingDef>.GetNamed("Cumpilation_Cum");
            sexFluidDef.consumableFluidRatio = 0.1f;
        }
    }
}


code:
using HarmonyLib;
using System;
using System.Collections.Generic;
using RimWorld;
using Verse;
using rjw;
using RJW_Onahole.Hediffs;
using System.Reflection;
using RJW_Onahole.Utilities;
using UnityEngine;
using System.Reflection.Emit;
using RJW_Onahole.Comps;
using Cumpilation.Leaking;
using Cumpilation.Gathering;
using System.Linq;

namespace RJW_Onahole
{
    [StaticConstructorOnStartup]
    internal static class Cumpilation
    {
        private static readonly Harmony harmony = new Harmony(nameof(RJW_Onahole) + nameof(Cumpilation));
        static Cumpilation()
        {
            // Ensure patching after main mod loaded
            LongEventHandler.QueueLongEvent(() => { harmony.PatchAll(); }, "RJW_Onahole_Cumpilation_LongEvent", false, null);
        }
    }
    [HarmonyPatch(typeof(HediffComp_LeakCum))]
    public static class DropCumFilth_Patch
    {
        [HarmonyTranspiler]
        [HarmonyPatch("DropCumFilth")]
        public static IEnumerable<CodeInstruction> DropCumFilth_Transpiler(IEnumerable<CodeInstruction> instructions)
        {
            List<CodeInstruction> codes = instructions.ToList();
            MethodInfo lookupFluidGatheringDef = AccessTools.Method(typeof(GatheringUtility), nameof(GatheringUtility.LookupFluidGatheringDef));
            bool found = false;
            for (int i = 0; i < codes.Count; i++)
            {
                if (codes[i].Calls(lookupFluidGatheringDef))
                {
                    found = true;
                    // this.amountLeaked = TryStoreFilth(this, this.amountLeaked, sexFluidDef);
                    List<CodeInstruction> newCodes = new List<CodeInstruction>
                    {
                        new CodeInstruction(OpCodes.Ldarg_0),//this for Stfld
                        new CodeInstruction(OpCodes.Ldarg_0),//this
                        new CodeInstruction(OpCodes.Ldarg_0),//this.amountLeaked
                        new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(HediffComp_LeakCum), "amountLeaked")), // this.amountLeaked
                        new CodeInstruction(OpCodes.Ldloc_0), // sexFluidDef
                        new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(DropCumFilth_Patch), nameof(TryStoreFilth))), // TryStoreFilth
                        new CodeInstruction(OpCodes.Stfld, AccessTools.Field(typeof(HediffComp_LeakCum), "amountLeaked")) // this.amountLeaked
                    };
                    codes.InsertRange(i + 2, newCodes);
                    break;
                }
            }
            if (!found)
            {
                "Failed to patch Cumpilation.Gathering.GatheringUtility.LookupFluidGatheringDef. Failed to find target IL code.".LogError();
            }
            return codes;
        }
        private static float TryStoreFilth(HediffComp_LeakCum hediffComp_LeakCum, float amountLeaked, SexFluidDef sexFluidDef)
        {
            Pawn pawn = hediffComp_LeakCum.parent.pawn;
            if (pawn.OnaholeBed() is Building_OnaholeBed onaholeBed)
            {
                amountLeaked = onaholeBed.GetComp<CompCumCollector>()?.TryStoreCum(amountLeaked / 8f, sexFluidDef.filth) * 8f ?? amountLeaked; //8=20(magic in rjw)/2.5(cumpilation ratio)
            }
            return amountLeaked;
        }
    }
}