code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;

namespace Rimworld_Animations
{
    public class VoiceTagDef : Def
    {

        public float probability = 1;

    }
}


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

<ModMetaData>
	<name>Rimworld Animations 2.0</name>
	<author>C0ffee</author>
  <url>https://gitgud.io/c0ffeeeeeeee/rimworld-animations</url>
	<supportedVersions>

1.5

	</supportedVersions>
	<packageId>c0ffee.rimworld.animations</packageId>
	<modDependencies>

			<packageId>brrainz.harmony</packageId>
			<displayName>Harmony</displayName>
			<steamWorkshopUrl>steam://url/CommunityFilePage/2009463077</steamWorkshopUrl>
			<downloadUrl>https://github.com/pardeike/HarmonyRimWorld/releases/latest</downloadUrl>

			<packageId>UnlimitedHugs.HugsLib</packageId>
			<displayName>HugsLib</displayName>
			<downloadUrl>https://github.com/UnlimitedHugs/RimworldHugsLib/releases/latest</downloadUrl>
			<steamWorkshopUrl>steam://url/CommunityFilePage/818773962</steamWorkshopUrl>

			<packageId>rim.job.world</packageId>
			<displayName>RimJobWorld</displayName>
			<downloadUrl>https://www.loverslab.com/topic/110270-mod-rimjobworld/</downloadUrl>

	</modDependencies>
	<loadAfter>

UnlimitedHugs.HugsLib

brrainz.harmony

erdelf.humanoidalienraces

nals.facialanimation

com.yayo.yayoAni

	</loadAfter>
	<loadBefore>
	</loadBefore>
	<incompatibleWith>
	</incompatibleWith>
	<description>
    Rimworld Animations 2.0! Hurray!

    Questions or bugs?
    Chat with me on the forums: https://www.loverslab.com/topic/140386-rjw-animations/
    Or on the rjw discord: https://discord.gg/CXwHhv8

  </description>
</ModMetaData>

license: unknown


code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Manifest>
  <identifier>Rimworld-Animations</identifier>
  <version>2.0.0</version>
</Manifest>


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

	<!-- Mod menu -->
	<RimAnim_ModSettings>RJW Animation Settings</RimAnim_ModSettings>
	<RimAnim_SoundOverride>启用声音覆盖</RimAnim_SoundOverride>
	<RimAnim_GenitalRotation>控制生殖器旋转</RimAnim_GenitalRotation>
	<RimAnim_OrgasmQuiver>启用高潮颤抖</RimAnim_OrgasmQuiver>
	<RimAnim_RapeShiver>启用强奸颤动</RimAnim_RapeShiver>
	<RimAnim_HeartsDuringLovin>性爱时启用心形</RimAnim_HeartsDuringLovin>
	<RimAnim_PlayNonsexual>播放非性行为的动画 (牵手、亲热)</RimAnim_PlayNonsexual>
	<RimAnim_AnimManagerTab>启用动画管理器选项卡</RimAnim_AnimManagerTab>
	<RimAnim_ShiverIntensity>颤抖/颤动强度 (默认为 2): </RimAnim_ShiverIntensity>
	<RimAnim_Voices>在动画期间播放语音</RimAnim_Voices>
	<RimAnim_HumanlikeVoicesDefault>如果没有找到外星种族的声音，则默认播放人类的声音</RimAnim_HumanlikeVoicesDefault>
	<RimAnim_DebugMode>调试模式</RimAnim_DebugMode>
	<RimAnim_FloatRangeRenderTree>调整渲染树偏移表单的浮动范围:</RimAnim_FloatRangeRenderTree>

	<!-- Main Tab Window -->
	<RimAnims_AnimManager>Animation Manager</RimAnims_AnimManager>
	<RimAnims_Warning>警告--一般情况下，你不想更改人类偏移值，只想更改外星种族偏移值或动物偏移值</RimAnims_Warning>
	<RimAnims_CopyToClipboard>将偏移值复制到剪贴板</RimAnims_CopyToClipboard>
	<RimAnims_ShareSettings>将偏移值粘贴到 OffsetDef 中，或在 Discord 中共享</RimAnims_ShareSettings>

</LanguageData>


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

	<!-- Mod menu -->
	<RimAnim_ModSettings>RJW Animation Settings</RimAnim_ModSettings>
	<RimAnim_SoundOverride>啟用聲音覆蓋</RimAnim_SoundOverride>
	<RimAnim_GenitalRotation>控制生殖器旋轉</RimAnim_GenitalRotation>
	<RimAnim_OrgasmQuiver>啟用高潮顫抖</RimAnim_OrgasmQuiver>
	<RimAnim_RapeShiver>啟用強姦顫動</RimAnim_RapeShiver>
	<RimAnim_HeartsDuringLovin>性愛時啟用心形</RimAnim_HeartsDuringLovin>
	<RimAnim_PlayNonsexual>播放非性行為的動畫 (牽手、親熱)</RimAnim_PlayNonsexual>
	<RimAnim_AnimManagerTab>啟用動畫管理器選項卡</RimAnim_AnimManagerTab>
	<RimAnim_ShiverIntensity>顫抖/顫動強度 (預設為 2): </RimAnim_ShiverIntensity>
	<RimAnim_Voices>在動畫期間播放語音</RimAnim_Voices>
	<RimAnim_HumanlikeVoicesDefault>如果沒有找到外星種族的聲音，則默認播放人類的聲音</RimAnim_HumanlikeVoicesDefault>
	<RimAnim_DebugMode>除錯模式</RimAnim_DebugMode>
	<RimAnim_FloatRangeRenderTree>調整渲染樹偏移表單的浮動範圍:</RimAnim_FloatRangeRenderTree>

	<!-- Main Tab Window -->
	<RimAnims_AnimManager>Animation Manager</RimAnims_AnimManager>
	<RimAnims_Warning>警告--一般情況下，你不想更改人類偏移值，只想更改外星種族偏移值或動物偏移值</RimAnims_Warning>
	<RimAnims_CopyToClipboard>將偏移值複製到剪貼板</RimAnims_CopyToClipboard>
	<RimAnims_ShareSettings>將偏移值黏貼到 OffsetDef 中，或在 Discord 中共享</RimAnims_ShareSettings>

</LanguageData>


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

	<!-- Mod menu -->
	<RimAnim_ModSettings>RJW Animation Settings</RimAnim_ModSettings>
	<RimAnim_SoundOverride>Enable Sound Override</RimAnim_SoundOverride>
	<RimAnim_GenitalRotation>Control Genital Rotation</RimAnim_GenitalRotation>
	<RimAnim_OrgasmQuiver>Enable Orgasm Quiver</RimAnim_OrgasmQuiver>
	<RimAnim_RapeShiver>Enable Rape Shiver</RimAnim_RapeShiver>
	<RimAnim_HeartsDuringLovin>Enable hearts during lovin'</RimAnim_HeartsDuringLovin>
	<RimAnim_PlayNonsexual>Play animation for nonsexual acts (handholding, makeout)</RimAnim_PlayNonsexual>
	<RimAnim_AnimManagerTab>Enable Animation Manager Tab</RimAnim_AnimManagerTab>
	<RimAnim_ShiverIntensity>Shiver/Quiver Intensity (default 2): </RimAnim_ShiverIntensity>
	<RimAnim_Voices>Play voices during animations</RimAnim_Voices>
	<RimAnim_HumanlikeVoicesDefault>Play human voices by default, when none found for alien race</RimAnim_HumanlikeVoicesDefault>
	<RimAnim_DebugMode>Debug Mode</RimAnim_DebugMode>
	<RimAnim_FloatRangeRenderTree>Float range for Debug Render Tree offset menu: </RimAnim_FloatRangeRenderTree>

	<!-- Main Tab Window -->
	<RimAnims_AnimManager>Animation Manager</RimAnims_AnimManager>
	<RimAnims_Warning>Warning--You generally don't want to change human offsets, only alien offsets or animals</RimAnims_Warning>
	<RimAnims_CopyToClipboard>Copy Offset to Clipboard</RimAnims_CopyToClipboard>
	<RimAnims_ShareSettings>Paste offset values in OffsetDef, or share in Discord</RimAnims_ShareSettings>

</LanguageData>


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

  <OffsetManager.label>gerenciador de posições</OffsetManager.label>
  <OffsetManager.description>Controla as posições sexuais dos colonos.</OffsetManager.description>

</LanguageData>


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

  <Dog_Doggystyle.label>estilo cachorrinho</Dog_Doggystyle.label>
  <Horse_Cowgirl.label>vaqueira</Horse_Cowgirl.label>

</LanguageData>


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

  <Tribadism.label>tribadismo</Tribadism.label>
  <Cunnilingus.label>cunilíngua</Cunnilingus.label>

</LanguageData>


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

  <Double_Penetration.label>dupla penetração</Double_Penetration.label>

</LanguageData>


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

  <Doggystyle.label>estilo cachorrinho</Doggystyle.label>
  <Blowjob.label>boquete</Blowjob.label>
  <ReverseStandAndCarry.label>69</ReverseStandAndCarry.label>
  <Cowgirl.label>vaqueira</Cowgirl.label>

</LanguageData>


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

/

1.1

	</v1.1>
	<v1.2>

/

1.2

Patch_HatsDisplaySelection/1.2

	</v1.2>
	<v1.3>

/

1.3

Patch_HatsDisplaySelection/1.2

Patch_SexToysMasturbation

Patch_SexToysMasturbation/1.3

	</v1.3>
	<v1.4>

/

1.4

Patch_HumanoidAlienRaces/1.4

Patch_HatsDisplaySelection/1.2

Patch_SexToysMasturbation

Patch_SexToysMasturbation/1.4

	</v1.4>
	<v1.5>

/

1.5

Patch_HumanoidAlienRaces/1.5

Patch_SexToysMasturbation/1.5

Patch_FacialAnimation/1.5

Patch_NoRimNudeWorld/1.5

Patch_NoRimNudeWorldZoo/1.5

	</v1.5>

</loadFolders>


code:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{11DC70AF-FF23-4D4D-A4E5-6453664B1A12}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Milkable_Colonists_Animations</RootNamespace>
    <AssemblyName>Milkable-Colonists-Animations</AssemblyName>
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="0Harmony">
      <HintPath>..\..\..\..\..\workshop\content\294100\839005762\1.5\Assemblies\0Harmony.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="Assembly-CSharp">
      <HintPath>..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="RJW">
      <HintPath>..\..\rjw\1.4\Assemblies\RJW.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
    <Reference Include="UnityEngine">
      <HintPath>..\..\..\RimWorldWin64_Data\Managed\UnityEngine.dll</HintPath>
      <Private>False</Private>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="Source\Patches\Harmony_PatchAll.cs" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>


code:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Milkable-Colonists-Animations")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Milkable-Colonists-Animations")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("11dc70af-ff23-4d4d-a4e5-6453664b1a12")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using HarmonyLib;
using System.Reflection;

namespace MC_Animations {

    [StaticConstructorOnStartup]
    public static class Harmony_PatchAll {

        static Harmony_PatchAll() {

            Harmony val = new Harmony("mcanim");
            val.PatchAll(Assembly.GetExecutingAssembly());

        }
    }
}


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

	<Operation Class="PatchOperationSequence">
		<success>Always</success>
		<operations>

				<xpath>/Defs/PawnRenderTreeDef[defName="Humanlike"]/root/children/li[debugLabel="Head"]/subworkerClasses</xpath>
				<success>Always</success>
				<nomatch Class="PatchOperationAdd">
					<xpath>/Defs/PawnRenderTreeDef[defName="Humanlike"]/root/children/li[debugLabel="Head"]</xpath>
					<value>
						<subworkerClasses />
					</value>
				</nomatch>

				<xpath>/Defs/PawnRenderTreeDef[defName="Humanlike"]/root/children/li[debugLabel="Head"]/subworkerClasses</xpath>
				<value>

Rimworld_Animations.PawnRenderSubWorker_HideWhenAnimating

				</value>

		</operations>
	</Operation>

</Patch>


code:
using HarmonyLib;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using Verse;
using AlienRace;

namespace Rimworld_Animations {

	[StaticConstructorOnStartup]
	public static class HarmonyPatch_AlienRace
	{
		static HarmonyPatch_AlienRace()
		{
			(new Harmony("rjwanim")).Patch(AccessTools.Method(AccessTools.TypeByName("AlienRace.HarmonyPatches"), "DrawAddons"),
							prefix: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_AlienRace), "Prefix_AnimateHeadAddons")));
		}

		/* todo: replace jank prefix with this
		public static void Prefix_DrawAddonsFinalHook(ref Pawn pawn, ref AlienPartGenerator.BodyAddon addon, ref Rot4 rot, ref Graphic graphic, ref Vector3 offsetVector, ref float angle, ref Material mat)
        {
			CompBodyAnimator animator = pawn.TryGetComp<CompBodyAnimator>();

			if (animator == null || !animator.isAnimating)
            {
				return;
            }

			if(addon.alignWithHead || addon.drawnInBed)
            {
				rot = animator.headFacing;
				angle = animator.headAngle;
				offsetVector += animator.deltaPos + animator.bodyAngle * animator.headBob;

			}
			else
            {
				rot = animator.bodyFacing;
				angle = animator.bodyAngle;
				offsetVector += animator.deltaPos;
            }

        }
		*/
		public static bool Prefix_AnimateHeadAddons(PawnRenderFlags renderFlags, Vector3 vector, Vector3 headOffset, Pawn pawn, Quaternion quat, Rot4 rotation)
		{

			if (renderFlags.FlagSet(PawnRenderFlags.Portrait) || !CompBodyAnimator.IsAnimating(pawn)) return true;
			if (!(pawn.def is ThingDef_AlienRace alienProps) || renderFlags.FlagSet(PawnRenderFlags.Invisible)) return false;

			List<AlienPartGenerator.BodyAddon> addons = alienProps.alienRace.generalSettings.alienPartGenerator.bodyAddons;
			AlienPartGenerator.AlienComp comp = pawn.GetComp<AlienPartGenerator.AlienComp>();
			CompBodyAnimator pawnAnimator = pawn.TryGetComp<CompBodyAnimator>();

			bool flag = renderFlags.FlagSet(PawnRenderFlags.Portrait);
			bool flag2 = renderFlags.FlagSet(PawnRenderFlags.Invisible);

			for (int i = 0; i < addons.Count; i++)
			{
				AlienPartGenerator.BodyAddon ba = addons[index: i];

				if (!ba.CanDrawAddon(pawn: pawn)) continue;

				bool forceDrawForBody = false;
				if (alienProps.defName.Contains("Orassan") && ba.path.ToLower().Contains("tail"))
                {
					forceDrawForBody = true;
                }
				AlienPartGenerator.RotationOffset offset = ba.defaultOffsets.GetOffset((ba.drawnInBed && !forceDrawForBody) || ba.alignWithHead ? pawnAnimator.headFacing : pawnAnimator.bodyFacing);
				Vector3 a = (offset != null) ? offset.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, pawn.story.headType) : Vector3.zero;
				AlienPartGenerator.RotationOffset offset2 = ba.offsets.GetOffset((ba.drawnInBed && !forceDrawForBody) || ba.alignWithHead ? pawnAnimator.headFacing : pawnAnimator.bodyFacing);
				Vector3 vector2 = a + ((offset2 != null) ? offset2.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, pawn.story.headType) : Vector3.zero);
				vector2.y = (ba.inFrontOfBody ? (0.3f + vector2.y) : (-0.3f - vector2.y));
				float num = ba.angle;
				if (((ba.drawnInBed && !forceDrawForBody) || ba.alignWithHead ? pawnAnimator.headFacing : pawnAnimator.bodyFacing) == Rot4.North)
				{
					if (ba.layerInvert)
					{
						vector2.y = 0f - vector2.y;
					}
					num = 0f;
				}
				if (((ba.drawnInBed && !forceDrawForBody) || ba.alignWithHead ? pawnAnimator.headFacing : pawnAnimator.bodyFacing) == Rot4.East)
				{
					num = 0f - num;
					vector2.x = 0f - vector2.x;
				}
				Graphic addonGraphic = comp.addonGraphics[i];

				addonGraphic.drawSize = ((flag && ba.drawSizePortrait != Vector2.zero) ? ba.drawSizePortrait : ba.drawSize) * (ba.scaleWithPawnDrawsize ? (ba.alignWithHead ? ((flag ? comp.customPortraitHeadDrawSize : comp.customHeadDrawSize) * (ModsConfig.BiotechActive ? (pawn.ageTracker.CurLifeStage.headSizeFactor ?? 1.5f) : 1.5f)) : ((flag ? comp.customPortraitDrawSize : comp.customDrawSize) * (ModsConfig.BiotechActive ? pawn.ageTracker.CurLifeStage.bodySizeFactor : 1f) * 1.5f)) : (Vector2.one * 1.5f));

				if ((ba.drawnInBed && !forceDrawForBody) || ba.alignWithHead)
				{

					Quaternion addonRotation = Quaternion.AngleAxis(pawnAnimator.headAngle < 0 ? 360 - (360 % pawnAnimator.headAngle) : pawnAnimator.headAngle, Vector3.up);

					GenDraw.DrawMeshNowOrLater(mesh: addonGraphic.MeshAt(rot: pawnAnimator.headFacing), loc: vector + (ba.alignWithHead ? headOffset : headOffset - addonRotation * pawn.Drawer.renderer.BaseHeadOffsetAt(pawnAnimator.headFacing)) + vector2.RotatedBy(angle: Mathf.Acos(f: Quaternion.Dot(a: Quaternion.identity, b: addonRotation)) * 2f * 57.29578f),
					quat: Quaternion.AngleAxis(angle: num, axis: Vector3.up) * addonRotation, mat: addonGraphic.MatAt(rot: pawnAnimator.headFacing), renderFlags.FlagSet(PawnRenderFlags.DrawNow));

				}

				else
				{
					Quaternion addonRotation;
					if (AnimationSettings.controlGenitalRotation && ba.path.ToLower().Contains("penis"))
                    {
						addonRotation = Quaternion.AngleAxis(pawnAnimator.genitalAngle, Vector3.up);
					}
					else
                    {
						addonRotation = Quaternion.AngleAxis(pawnAnimator.bodyAngle, Vector3.up);
					}

					if (AnimationSettings.controlGenitalRotation && pawnAnimator.controlGenitalAngle && ba?.hediffGraphics != null && ba.hediffGraphics.Count != 0 && ba.hediffGraphics[0]?.path != null && (ba.hediffGraphics[0].path.Contains("Penis") || ba.hediffGraphics[0].path.Contains("penis")))
					{
						GenDraw.DrawMeshNowOrLater(mesh: addonGraphic.MeshAt(rot: rotation), loc: vector + (ba.alignWithHead ? headOffset : Vector3.zero) + vector2.RotatedBy(angle: Mathf.Acos(f: Quaternion.Dot(a: Quaternion.identity, b: addonRotation)) * 2f * 57.29578f),
						quat: Quaternion.AngleAxis(angle: pawnAnimator.genitalAngle, axis: Vector3.up), mat: addonGraphic.MatAt(rot: rotation), renderFlags.FlagSet(PawnRenderFlags.DrawNow));
					}

					else
                    {
						GenDraw.DrawMeshNowOrLater(mesh: addonGraphic.MeshAt(rot: rotation), loc: vector + (ba.alignWithHead ? headOffset : Vector3.zero) + vector2.RotatedBy(angle: Mathf.Acos(f: Quaternion.Dot(a: Quaternion.identity, b: addonRotation)) * 2f * 57.29578f),
						quat: Quaternion.AngleAxis(angle: num, axis: Vector3.up) * addonRotation, mat: addonGraphic.MatAt(rot: rotation), renderFlags.FlagSet(PawnRenderFlags.DrawNow));
					}

				}

			}

			return false;
		}
	}

	/*

    [HarmonyPatch(typeof(AlienRace.HarmonyPatches), "DrawAddons")]
    public static class HarmonyPatch_AlienRace {

		public static void RenderHeadAddonInAnimation(Mesh mesh, Vector3 loc, Quaternion quat, Material mat, bool drawNow, Graphic graphic, AlienPartGenerator.BodyAddon bodyAddon, Vector3 v, Vector3 headOffset, Pawn pawn, PawnRenderFlags renderFlags, Vector3 vector, Rot4 rotation)
        {

			CompBodyAnimator pawnAnimator = pawn.TryGetComp<CompBodyAnimator>();
			AlienPartGenerator.AlienComp comp = pawn.GetComp<AlienPartGenerator.AlienComp>();

			if (pawnAnimator != null && pawnAnimator.isAnimating)
            {

				if((bodyAddon.drawnInBed || bodyAddon.alignWithHead))
                {

					AlienPartGenerator.RotationOffset offset = bodyAddon.defaultOffsets.GetOffset(rotation);
					Vector3 a = (offset != null) ? offset.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, comp.crownType) : Vector3.zero;
					AlienPartGenerator.RotationOffset offset2 = bodyAddon.offsets.GetOffset(rotation);
					Vector3 vector2 = a + ((offset2 != null) ? offset2.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, comp.crownType) : Vector3.zero);
					vector2.y = (bodyAddon.inFrontOfBody ? (0.3f + vector2.y) : (-0.3f - vector2.y));
					float num = bodyAddon.angle;
					if (rotation == Rot4.North)
					{
						if (bodyAddon.layerInvert)
						{
							vector2.y = -vector2.y;
						}
						num = 0f;
					}
					if (rotation == Rot4.East)
					{
						num = -num;
						vector2.x = -vector2.x;
					}

					vector = vector + Quaternion.AngleAxis(pawnAnimator.bodyAngle, Vector3.up) * pawn.Drawer.renderer.BaseHeadOffsetAt(pawnAnimator.bodyFacing) - pawnAnimator.getPawnHeadOffset(); //convert vector into pseudo body pos for head
					quat = Quaternion.AngleAxis(pawnAnimator.headAngle, Vector3.up);
					loc = vector + (bodyAddon.alignWithHead ? headOffset : Vector3.zero) + vector2.RotatedBy(Mathf.Acos(Quaternion.Dot(Quaternion.identity, quat)) * 2f * 57.29578f);
					mat = graphic.MatAt(rot: pawnAnimator.headFacing);
				}
				else
                {

					AlienPartGenerator.RotationOffset offset = bodyAddon.defaultOffsets.GetOffset(rotation);
					Vector3 a = (offset != null) ? offset.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, comp.crownType) : Vector3.zero;
					AlienPartGenerator.RotationOffset offset2 = bodyAddon.offsets.GetOffset(rotation);
					Vector3 vector2 = a + ((offset2 != null) ? offset2.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, comp.crownType) : Vector3.zero);
					vector2.y = (bodyAddon.inFrontOfBody ? (0.3f + vector2.y) : (-0.3f - vector2.y));
					float num = bodyAddon.angle;
					if (rotation == Rot4.North)
					{
						if (bodyAddon.layerInvert)
						{
							vector2.y = -vector2.y;
						}
						num = 0f;
					}
					if (rotation == Rot4.East)
					{
						num = -num;
						vector2.x = -vector2.x;
					}
					quat = Quaternion.AngleAxis(pawnAnimator.bodyAngle, Vector3.up);
					loc = vector + (bodyAddon.alignWithHead ? headOffset : Vector3.zero) + vector2.RotatedBy(Mathf.Acos(Quaternion.Dot(Quaternion.identity, quat)) * 2f * 57.29578f);

				}

			}
			GenDraw.DrawMeshNowOrLater(mesh, loc, quat, mat, drawNow);

			/*
			if (pawnAnimator != null && !renderFlags.FlagSet(PawnRenderFlags.Portrait) && pawnAnimator.isAnimating && (bodyAddon.drawnInBed || bodyAddon.alignWithHead))
            {

				if ((pawn.def as ThingDef_AlienRace).defName == "Alien_Orassan")
                {
					orassan = true;

					if(bodyAddon.path.Contains("closed"))
                    {
						return;
                    }

					if (bodyAddon.bodyPart.Contains("ear"))

					{
						orassan = true;

						orassanv = new Vector3(0, 0, 0.23f);
						if (pawnAnimator.headFacing == Rot4.North)
						{
							orassanv.z -= 0.1f;
							orassanv.y += 1f;

							if(bodyAddon.bodyPart.Contains("left"))
                            {
								orassanv.x += 0.03f;
                            } else
                            {
								orassanv.x -= 0.03f;
							}

						}
						else if (pawnAnimator.headFacing == Rot4.East)
						{
							orassanv.x -= 0.1f;
						}
						else if (pawnAnimator.headFacing == Rot4.West)
						{
							orassanv.x = 0.1f;
						}
						else
                        {
							orassanv.z -= 0.1f;
							orassanv.y += 1f;

							if (bodyAddon.bodyPart.Contains("right"))
							{
								orassanv.x += 0.05f;
							}
							else
							{
								orassanv.x -= 0.05f;
							}
						}
						orassanv = orassanv.RotatedBy(pawnAnimator.headAngle);
					}
				}

			GenDraw.DrawMeshNowOrLater(mesh: graphic.MeshAt(rot: headRotInAnimation), loc: loc + orassanv + (bodyAddon.alignWithHead ? headOffset : Vector3.zero),// + v.RotatedBy(Mathf.Acos(Quaternion.Dot(Quaternion.identity, quat)) * 2f * 57.29578f),
					quat: Quaternion.AngleAxis(angle: num, axis: Vector3.up) * headQuatInAnimation, mat: graphic.MatAt(rot: pawnAnimator.headFacing), drawNow: drawNow);;
			}

			else
            {

			}

		}

		public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
        {
			List<CodeInstruction> ins = instructions.ToList();
			for (int i = 0; i < ins.Count; i++)
            {

				Type[] type = new Type[] { typeof(Mesh), typeof(Vector3), typeof(Quaternion), typeof(Material), typeof(bool) };

				if (ins[i].OperandIs(AccessTools.Method(typeof(GenDraw), "DrawMeshNowOrLater", type)))
                {

					yield return new CodeInstruction(OpCodes.Ldloc, (object)7); //graphic
					yield return new CodeInstruction(OpCodes.Ldloc, (object)4); //bodyAddon
					yield return new CodeInstruction(OpCodes.Ldloc, (object)5); //offsetVector/AddonOffset (v)
					yield return new CodeInstruction(OpCodes.Ldarg, (object)2); //headOffset
					yield return new CodeInstruction(OpCodes.Ldarg, (object)3); //pawn
					yield return new CodeInstruction(OpCodes.Ldarg, (object)0); //renderflags
					yield return new CodeInstruction(OpCodes.Ldarg, (object)1); //vector
					yield return new CodeInstruction(OpCodes.Ldarg, (object)5); //rotation

					yield return new CodeInstruction(OpCodes.Call, AccessTools.DeclaredMethod(typeof(HarmonyPatch_AlienRace), "RenderHeadAddonInAnimation"));

                }

				else
                {
					yield return ins[i];
				}
            }
        }

		public static bool Prefix(PawnRenderFlags renderFlags, ref Vector3 vector, ref Vector3 headOffset, Pawn pawn, ref Quaternion quat, ref Rot4 rotation)
		{
			if(pawn == null)
            {
				return true;
			}

			CompBodyAnimator anim = pawn.TryGetComp<CompBodyAnimator>();

			if(anim == null)
            {
				return true;
            }

			if (anim != null && !renderFlags.FlagSet(PawnRenderFlags.Portrait) && anim.isAnimating)
			{
				//quat = Quaternion.AngleAxis(anim.bodyAngle, Vector3.up);
			}

			return true;

		}
	}

	*/

}


code:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{C76F3790-9AC0-4827-ACD5-84174238954F}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Patch_HumanoidAlienRaces</RootNamespace>
    <AssemblyName>Patch_HumanoidAlienRaces</AssemblyName>
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>false</DebugSymbols>
    <DebugType>none</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>1.5\Assemblies\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="0Harmony">
      <HintPath>..\..\..\..\..\workshop\content\294100\839005762\1.4\Assemblies\0Harmony.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="AlienRace">
      <HintPath>..\..\..\..\..\workshop\content\294100\839005762\1.5\Assemblies\AlienRace.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="Assembly-CSharp">
      <HintPath>..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="Rimworld-Animations">
      <HintPath>..\1.4\Assemblies\Rimworld-Animations.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="RJW">
      <HintPath>..\..\rjw\1.4\Assemblies\RJW.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
    <Reference Include="UnityEngine">
      <HintPath>..\..\..\RimWorldWin64_Data\Managed\UnityEngine.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.CoreModule">
      <HintPath>..\..\..\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="1.5\Source\Patches\Harmony_PatchAll.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="1.5\Assemblies\Patch_HumanoidAlienRaces.dll" />
  </ItemGroup>
  <ItemGroup />
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>


code:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Patch_HumanoidAlienRaces")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Patch_HumanoidAlienRaces")]
[assembly: AssemblyCopyright("Copyright ©  2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c76f3790-9ac0-4827-acd5-84174238954f")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<!-- placeholder for when RimNude isn't installed -->
	<PawnRenderNodeTagDef>
		<defName>RimNude_Penis</defName>
	</PawnRenderNodeTagDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<!-- placeholder for when RimNude isn't installed -->
	<PawnRenderNodeTagDef>
		<defName>AnimalPenis</defName>
	</PawnRenderNodeTagDef>
</Defs>


code:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Rimworld-Animations")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Rimworld-Animations")]
[assembly: AssemblyCopyright("Copyright ©  2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("71b05d71-67b2-4014-82cd-18c20ac0882f")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


code:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{71B05D71-67B2-4014-82CD-18C20AC0882F}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Rimworld_Animations</RootNamespace>
    <AssemblyName>Rimworld-Animations</AssemblyName>
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
    <TargetFrameworkProfile />
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>false</DebugSymbols>
    <DebugType>none</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>1.5\Assemblies\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>none</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="0Harmony">
      <HintPath>..\..\..\..\workshop\content\294100\1321849735\1.4\Assemblies\0Harmony.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="AlienRace">
      <HintPath>..\..\..\..\workshop\content\294100\839005762\1.4\Assemblies\AlienRace.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="Assembly-CSharp">
      <HintPath>..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="RJW">
      <HintPath>..\rjw\1.5\Assemblies\RJW.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="RJW-ToysAndMasturbation">
      <HintPath>..\rjw-toys-and-masturbation\Assemblies\RJW-ToysAndMasturbation.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
    <Reference Include="UnityEngine">
      <HintPath>..\..\RimWorldWin64_Data\Managed\UnityEngine.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.CoreModule">
      <HintPath>..\..\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.IMGUIModule">
      <HintPath>..\..\RimWorldWin64_Data\Managed\UnityEngine.IMGUIModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="1.5\Source\Actors\Actor.cs" />
    <Compile Include="1.5\Source\Actors\AlienRaceOffset.cs" />
    <Compile Include="1.5\Source\Animations\AnimationOffsets\AnimationOffsetDef.cs" />
    <Compile Include="1.5\Source\Animations\AnimationOffsets\Offsets\AnimationOffset_AgeRange.cs" />
    <Compile Include="1.5\Source\Animations\AnimationOffsets\Offsets\AnimationOffset_BodyType.cs" />
    <Compile Include="1.5\Source\Animations\AnimationOffsets\Offsets\AnimationOffset_BodyTypeGendered.cs" />
    <Compile Include="1.5\Source\Animations\AnimationOffsets\Offsets\AnimationOffset_Single.cs" />
    <Compile Include="1.5\Source\Animations\AnimationOffsets\Offsets\BaseAnimationOffset.cs" />
    <Compile Include="1.5\Source\Animations\AnimationOffsets\Offsets\BodyTypeOffset.cs" />
    <Compile Include="1.5\Source\Animations\AnimationProps\AnimationPropDef.cs" />
    <Compile Include="1.5\Source\Animations\AnimationWorkers\AnimationWorker_KeyframesExtended.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\BasePawnTest.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_BodyType.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_Never.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_Humanlike.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_PrisonerOfColony.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_SlaveOfColony.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_Always.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_JobDef.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_Multi.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_Race.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_RJWCanBeFucked.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_RJWCanFuck.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_Trait.cs" />
    <Compile Include="1.5\Source\Animations\PawnTests\PawnTest_Hediff.cs" />
    <Compile Include="1.5\Source\Comps\CompExtendedAnimator.cs" />
    <Compile Include="1.5\Source\Comps\CompProperties_ExtendedAnimator.cs" />
    <Compile Include="1.5\Source\Comps\CompProperties_ThingAnimator.cs" />
    <Compile Include="1.5\Source\Comps\CompThingAnimator.cs" />
    <Compile Include="1.5\Source\Comps\ExtendedAnimatorAnchor\BaseExtendedAnimatorAnchor.cs" />
    <Compile Include="1.5\Source\Comps\ExtendedAnimatorAnchor\ExtendedAnimatorAnchor_Thing.cs" />
    <Compile Include="1.5\Source\Comps\ExtendedAnimatorAnchor\ExtendedAnimatorAnchor_Vector3.cs" />
    <Compile Include="1.5\Source\Defs\AnimationDefOf.cs" />
    <Compile Include="1.5\Source\Animations\GroupAnimations\GroupAnimationContexts\BaseGroupAnimationContext.cs" />
    <Compile Include="1.5\Source\Animations\GroupAnimations\GroupAnimationContexts\GroupAnimationContext_RJWSex.cs" />
    <Compile Include="1.5\Source\Animations\GroupAnimations\GroupAnimationDef.cs" />
    <Compile Include="1.5\Source\Animations\GroupAnimations\GroupAnimationStages\AnimationStage.cs" />
    <Compile Include="1.5\Source\Animations\GroupAnimations\GroupAnimationStages\AnimationStage_Branch.cs" />
    <Compile Include="1.5\Source\Animations\GroupAnimations\GroupAnimationStages\AnimationStage_LoopRandomSelectChance.cs" />
    <Compile Include="1.5\Source\Animations\GroupAnimations\GroupAnimationStages\AnimationStage_TicksDuration.cs" />
    <Compile Include="1.5\Source\Animations\Keyframes\ExtendedKeyframe.cs" />
    <Compile Include="1.5\Source\MainTabWindows\MainTabWindow_OffsetConfigure.cs" />
    <Compile Include="1.5\Source\MainTabWindows\OffsetMainButtonDefOf.cs" />
    <Compile Include="1.5\Source\MainTabWindows\WorldComponent_UpdateMainTab.cs" />
    <Compile Include="1.5\Source\Patches\Harmony_PatchAll.cs" />
    <Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_Dialog_DebugRenderTree.cs" />
    <Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_PawnRenderer.cs" />
    <Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_PawnRenderNode.cs" />
    <Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_PawnRenderNodeWorker.cs" />
    <Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_PawnRenderTree.cs" />
    <Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_Pawn_DrawTracker.cs" />
    <Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_Thing.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_Masturbate.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\JobDriver_Sex\HarmonyPatch_Animate.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\JobDriver_Sex\HarmonyPatch_PlaySexSounds.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\JobDriver_Sex\HarmonyPatch_SexTick.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\HarmonyPatch_WorkGiverSex.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_JoinInBed.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_Sex.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_SexBaseInitiator.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\SexBaseReceivers\HarmonyPatch_JobDriver_SexBaseReceiverRaped.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\SexBaseReceivers\HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicBodyTypeVariants\PawnRenderNodeProperties_GraphicBodyTypeVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicBodyTypeVariants\PawnRenderNodeWorker_GraphicBodyTypeVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicBodyTypeVariants\PawnRenderNode_GraphicBodyTypeVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicHediffSeverityVariants\PawnRenderNodeProperties_GraphicHediffSeverityVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicHediffSeverityVariants\PawnRenderNodeWorker_GraphicHediffSeverityVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicHediffSeverityVariants\PawnRenderNode_GraphicHediffSeverityVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicHediffVariants\PawnRenderNodeProperties_GraphicHediffVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicHediffVariants\PawnRenderNodeWorker_GraphicHediffVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicHediffVariants\PawnRenderNode_GraphicHediffVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicVariants\PawnRenderNodeProperties_GraphicVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicVariants\PawnRenderNodeWorker_GraphicVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\GraphicVariants\PawnRenderNode_GraphicVariants.cs" />
    <Compile Include="1.5\Source\PawnRenderNode\TexPathVariants.cs" />
    <Compile Include="1.5\Source\RenderSubWorkers\PawnRenderSubWorker_ChangeOffset.cs" />
    <Compile Include="1.5\Source\Patches\RJWPatches\RJWAnimationSettings.cs" />
    <Compile Include="1.5\Source\RenderSubWorkers\PawnRenderSubWorker_HideWhenAnimating.cs" />
    <Compile Include="1.5\Source\Utilities\AnimationUtility.cs" />
    <Compile Include="1.5\Source\Voices\VoiceDef.cs" />
    <Compile Include="1.5\Source\Voices\VoiceDefOf.cs" />
    <Compile Include="1.5\Source\Voices\VoiceTagDef.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="1.5\Assemblies\0MultiplayerAPI.dll" />
    <Content Include="1.5\Assemblies\Rimworld-Animations.dll" />
    <Content Include="1.5\Assemblies\RJW.dll" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\GroupAnimation_DogBeast.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\Stage1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\Stage2.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\Stage3_Variant1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\Stage3_Variant2_FollowupWithVariant1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\Stage3_Variant3.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\Stage4.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\Stage5_Variant1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\Stage5_Variant2.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\Stage5_Variant3.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Beast\DogBeast\Stage6.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\AnimationPropDef_Cum.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\GroupAnimation_Blowjob.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\OffsetDef_Blowjob.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage2a.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage2b.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage2c.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage3.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage4a.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage4b.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage4c.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage5.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage6a.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Blowjob\Stage6b.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\AnimationPropDef_Cowgirl_Xray.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\Cowgirl_Stage1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\Cowgirl_Stage2_1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\Cowgirl_Stage2_2.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\Cowgirl_Stage2_3.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\Cowgirl_Stage3_XRay.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\Cowgirl_Stage4.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\Cowgirl_Stage_1_5.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\GroupAnimation_Cowgirl.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\OffsetDef_Cowgirl.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\AnimationPropDef_Saliva.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\GroupAnimation_Cunnilingus.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\OffsetDef_Cunnilingus.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\Stage1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\Stage2a.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\Stage2b.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\Stage2c.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\Stage3_LoopOnce.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\Stage4a.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\Stage4b.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\Stage4c.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\Stage5.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cunnilingus\Stage6.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\GroupAnimation_DP.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\OffsetDef_DP.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage2a.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage2b.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage2c.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage2d.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage3.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage4.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage5a.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage5b.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage5c.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\DoublePenetration\Stage5_Base.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Missionary\GroupAnimation_Missionary.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Missionary\OffsetDef_Missionary.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Missionary\Stage1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Missionary\Stage2.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Missionary\Stage2b.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Missionary\Stage2c.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Missionary\Stage3_DontLoop.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Missionary\Stage4.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Missionary\Stage5.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Missionary\Stage6.xml" />
    <Content Include="1.5\Defs\AnimationPropDefs\AnimationPropDef_Hand.xml" />
    <Content Include="1.5\Defs\OffsetDefs\OffsetDef_Placeholder.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\1 Intro\Doggystyle Intro1.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\1 Intro\Doggystyle Intro2.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\1 Intro\Doggystyle Intro3.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\1 Intro\Doggystyle1a.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\2 Main\Doggystyle1b.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\2 Main\Doggystyle2.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\2 Main\Doggystyle3.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\2 Main\Doggystyle4.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\2 Main\Doggystyle5.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\2 Main\Doggystyle6.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\2 Main\Doggystyle7.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\3 Ending\Doggystyle8.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\3 Ending\Doggystyle8a.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\3 Ending\Doggystyle8b.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\3 Ending\Doggystyle8c.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\3 Ending\Doggystyle8d.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\3 Ending\Doggystyle8e.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\Misc\AnimationPropDef_BEV.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\Misc\GroupAnimation_Doggystyle_Condom_BEV.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\Misc\OffsetDef_Doggystyle_BEV.xml" />
    <Content Include="1.5\Defs\TestDoNotPush\Experimental\Misc\TexPathVariants_Doggystyle_BEV.xml" />
    <Content Include="1.5\Defs\TexPathVariantsDefs\TexPathVariants_XrayPenis_Human.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\TestAnimation\TestAnimation1.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\TestAnimation\TestAnimation2.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\TestAnimation\TestAnimation3.xml" />
    <Content Include="1.5\Defs\AnimationPropDefs\AnimationPropDef_Knees.xml" />
    <Content Include="1.5\Defs\AnimationPropDefs\AnimationPropDef_Xray_Inside.xml" />
    <Content Include="1.5\Defs\AnimationPropDefs\AnimationPropDef_Banana.xml" />
    <Content Include="1.5\Defs\AnimationPropDefs\AnimationPropDef_Xray_Penis.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\TestAnimation\TestGroupAnimation1.xml" />
    <Content Include="1.5\Defs\MainTabDefs\MainButtonDef.xml" />
    <Content Include="1.5\Defs\OffsetDefs\OffsetDef_GroinToAppropriateHeight.xml" />
    <Content Include="1.5\Defs\SoundDefs\Sounds_Sex.xml" />
    <Content Include="1.5\Defs\TexPathVariantsDefs\TexPathVariants_Cat.xml" />
    <Content Include="1.5\Defs\TexPathVariantsDefs\TexPathVariants_Arms.xml" />
    <Content Include="1.5\Defs\TexPathVariantsDefs\TexPathVariants_Knees.xml" />
    <Content Include="1.5\Defs\TexPathVariantsDefs\TexPathVariants_Xray_Inside.xml" />
    <Content Include="1.5\Defs\TexPathVariantsDefs\TexPathVariants_XrayPenis_Horse.xml" />
    <Content Include="1.5\Defs\GroupAnimationDefs\Cowgirl\TexPathVariants_Cowgirl.xml" />
    <Content Include="1.5\Defs\VoiceDefs\VoiceDef_Human\SoundDef_HumanFemale.xml" />
    <Content Include="1.5\Defs\VoiceDefs\VoiceDef_Human\SoundDef_HumanMale.xml" />
    <Content Include="1.5\Defs\VoiceDefs\VoiceDef_Human\VoiceDef_Human.xml" />
    <Content Include="1.5\Defs\VoiceDefs\VoiceDef_Orassan.xml" />
    <Content Include="1.5\Defs\VoiceDefs\VoiceTagDef.xml" />
    <Content Include="1.5\Patches\AnimationPatchHSK.xml" />
    <Content Include="1.5\Patches\AnimationPatch_CompExtendedAnimator.xml" />
    <Content Include="1.5\Patches\AnimationPatch_PawnRenderTree_OffsetSubWorker.xml" />
    <Content Include="1.5\Patches\CompatibilityPatch_FacialAnimation.xml" />
    <Content Include="1.5\Patches\CompatibilityPatch_HCSK.xml" />
    <Content Include="1.5\Patches\CompPatches\AutoCleaner.xml" />
    <Content Include="1.5\Patches\CompPatches\CombatExtended.xml" />
    <Content Include="1.5\Patches\CompPatches\ZombieLand.xml" />
    <Content Include="1.5\Patches\Patch_GenitaliaRenderNode.xml" />
    <Content Include="1.5\Sounds\Sex\Clap_1.wav" />
    <Content Include="1.5\Sounds\Sex\Clap_2.wav" />
    <Content Include="1.5\Sounds\Sex\Clap_3.wav" />
    <Content Include="1.5\Sounds\Sex\Clap_4.wav" />
    <Content Include="1.5\Sounds\Sex\Clap_5.wav" />
    <Content Include="1.5\Sounds\Sex\Clap_6.wav" />
    <Content Include="1.5\Sounds\Sex\Clap_7.wav" />
    <Content Include="1.5\Sounds\Sex\Clap_8.wav" />
    <Content Include="1.5\Sounds\Sex\cum.wav" />
    <Content Include="1.5\Sounds\Sex\kucyu04.wav" />
    <Content Include="1.5\Sounds\Sex\Slap\Slap_1.wav" />
    <Content Include="1.5\Sounds\Sex\Slap\Slap_2.wav" />
    <Content Include="1.5\Sounds\Sex\Slap\Slap_3.wav" />
    <Content Include="1.5\Sounds\Sex\Slap\Slap_4.wav" />
    <Content Include="1.5\Sounds\Sex\Slap\Slap_5.wav" />
    <Content Include="1.5\Sounds\Sex\Slime\Slimy1.wav" />
    <Content Include="1.5\Sounds\Sex\Slime\Slimy2.wav" />
    <Content Include="1.5\Sounds\Sex\Slime\Slimy3.wav" />
    <Content Include="1.5\Sounds\Sex\Slime\Slimy4.wav" />
    <Content Include="1.5\Sounds\Sex\Slime\Slimy5.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Suck_1.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Suck_10.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Suck_2.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Suck_3.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Suck_4.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Suck_5.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Suck_6.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Suck_7.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Suck_8.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Suck_9.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Swallow_1.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Swallow_2.wav" />
    <Content Include="1.5\Sounds\Sex\Suck\Swallow_3.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Grunt1.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Grunt2.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Grunt3.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Grunt4.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Grunt5.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Grunt6.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Moan1.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Moan2.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Moan3.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Moan4.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\MoanShort1.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\MoanShort2.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\MoanShort3.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Scream1.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Scream2.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Scream3.wav" />
    <Content Include="1.5\Sounds\Voices\FVoice\Scream4.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Grunt1.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Grunt2.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Grunt3.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Grunt4.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Moan1.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Moan2.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Moan3.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Moan4.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\MoanShort1.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\MoanShort2.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\MoanShort3.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Scream1.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Scream2.wav" />
    <Content Include="1.5\Sounds\Voices\MVoice\Scream3.wav" />
    <Content Include="1.5\Textures\AnimationProps\Banana\Banana_east.png" />
    <Content Include="1.5\Textures\AnimationProps\Banana\Banana_north.png" />
    <Content Include="1.5\Textures\AnimationProps\Banana\Banana_south.png" />
    <Content Include="1.5\Textures\AnimationProps\Banana\Banana_west.png" />
    <Content Include="1.5\Textures\AnimationProps\Cat\Cat1_north.png" />
    <Content Include="1.5\Textures\AnimationProps\Cat\Cat2_north.png" />
    <Content Include="1.5\Textures\AnimationProps\Cum\Cum.png" />
    <Content Include="1.5\Textures\AnimationProps\Doggystyle\Doggy_Arms_north.png" />
    <Content Include="1.5\Textures\AnimationProps\Doggystyle\Doggy_Legs_north.png" />
    <Content Include="1.5\Textures\AnimationProps\Hand\Hand_north.png" />
    <Content Include="1.5\Textures\AnimationProps\MissingTexture\MissingTexture_east.png" />
    <Content Include="1.5\Textures\AnimationProps\MissingTexture\MissingTexture_north.png" />
    <Content Include="1.5\Textures\AnimationProps\MissingTexture\MissingTexture_south.png" />
    <Content Include="1.5\Textures\AnimationProps\MissingTexture\MissingTexture_west.png" />
    <Content Include="1.5\Textures\AnimationProps\CowgirlXray\XRay2-1.png" />
    <Content Include="1.5\Textures\AnimationProps\CowgirlXray\XRay2-2.png" />
    <Content Include="1.5\Textures\AnimationProps\CowgirlXray\XRay2-3.png" />
    <Content Include="1.5\Textures\AnimationProps\CowgirlXray\XRay2-4.png" />
    <Content Include="1.5\Textures\AnimationProps\CowgirlXray\XRay2-5.png" />
    <Content Include="1.5\Textures\AnimationProps\CowgirlXray\XRay2-6.png" />
    <Content Include="1.5\Textures\AnimationProps\Saliva\Saliva_north.png" />
    <Content Include="1.5\Textures\UI\MainTab.png" />
    <Content Include="About\About.xml" />
    <Content Include="About\Manifest.xml" />
    <Content Include="Languages\English\Keyed\RJWAnimations-LanguageData.xml" />
    <Content Include="Languages\PortugueseBrazilian\DefInjected\MainButtonDef\MainButtonDef.xml" />
    <Content Include="Languages\PortugueseBrazilian\DefInjected\Rimworld_Animations.AnimationDef\Animations_Beast.xml" />
    <Content Include="Languages\PortugueseBrazilian\DefInjected\Rimworld_Animations.AnimationDef\Animations_Lesbian.xml" />
    <Content Include="Languages\PortugueseBrazilian\DefInjected\Rimworld_Animations.AnimationDef\Animations_Multi.xml" />
    <Content Include="Languages\PortugueseBrazilian\DefInjected\Rimworld_Animations.AnimationDef\Animations_vanilla.xml" />
    <Content Include="LoadFolders.xml" />
    <Content Include="Patch_FacialAnimation\1.5\Patches\AnimationPatch_HideHeadWhenAnimating.xml" />
    <Content Include="Patch_NoRimNudeWorldZoo\1.5\Defs\PawnRenderNodeTagDef_AnimalPenisPlaceholder.xml" />
    <Content Include="Patch_NoRimNudeWorld\1.5\Defs\PawnRenderNodeTagDef_RimnudePenisPlaceholder.xml" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="1.5\Source\Extensions\" />
    <Folder Include="1.5\Source\Patches\OtherModPatches\" />
    <Folder Include="1.5\Source\Settings\" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>


code:
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35431.28
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rimworld-Animations", "Rimworld-Animations.csproj", "{71B05D71-67B2-4014-82CD-18C20AC0882F}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{71B05D71-67B2-4014-82CD-18C20AC0882F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{71B05D71-67B2-4014-82CD-18C20AC0882F}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{71B05D71-67B2-4014-82CD-18C20AC0882F}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{71B05D71-67B2-4014-82CD-18C20AC0882F}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {7E01292A-D76F-4CA3-AA64-085B84ECD905}
	EndGlobalSection
EndGlobal


code:
vcaim:
	mkdir -p bin
	g++ -o bin/vcaim src/main.cpp src/mem.cpp src/program.cpp -Iinclude -pthread -m32 -lXtst -lX11 -std=c++11

install:
	mkdir -p /usr/local/etc/vcaim
	cp offsets.ini /usr/local/etc/vcaim/
	cp config.ini /usr/local/etc/vcaim/
	cp bin/vcaim /usr/local/bin/vcaim
	chown root:root /usr/local/bin/vcaim
	chmod 700 /usr/local/bin/vcaim

clean:
	rm -rf bin

repo_name: offlineJ/vcaim

path: Makefile


code:
# VC's Aim - Linux CS:GO Aimbot
VC's Aim is a linux aimbot, triggerbot, and bhop script for CS:GO. [Here's a video](https://www.youtube.com/watch?v=-FrsAu06nV0).

## Downgrading to 32-bit
woop woop watch out CS:GO just updated to 64-bit on linux, you will have to downgrade your CS:GO copy to 32-bit by following these instructions:

 * Download older version: Library->CSGO Properties->BETA tab->Choose: 13532.
 * Copy the 32bit executable to temp folder: cp ~/.steam/steam/steamapps/common/Counter-Strike\ Global\ Offensive/csgo_linux ~
 * Switch back from the beta back to the 64-bit version
 * Copy the 32-bit binary back to the CS:GO directory
 * Edit csgo.sh in the CS:GO directory, change line 30 to read "csgo_linux" from "csgo_linux64"
 * enjoy you are game

([Source](https://github.com/ValveSoftware/csgo-osx-linux/issues/740#issuecomment-221989404))

I am planning on completely rewriting this bot at some point, if 64-bit is here to stay I will make it for that. It sounds like lots of people are having problems, though, so we'll see if they revert it.

## Compiling

### Prerequisites
You need a few packages to get this working.

#### Debian/Ubuntu

    sudo apt-get install gcc-multilib g++-multilib libxtst-dev:i386 libx11-dev:i386

#### Arch Linux

    sudo pacman -S gcc-multilib lib32-libxtst lib32-libx11

### Compiling / Installation
Just run ```make```, bruh. Optionally install with ```sudo make install```. Configuration is moved to ```/usr/local/etc/vcaim/``` if you install.

## Using

Bind aim/trigger key to ```+alt1``` in CS:GO. Bind bhop to ```+alt2```. space has to be set to jump, so use a different key (you can change this in program.cpp)

## Configuration

### Trigger

There are currently two methods used for triggering:

#### InCross
This is the most popular and technically the easiest way of doing a triggerbot. The bot checks your crosshair ID to see if you're aiming at someone, and shoots if so. Upsides include it working on the whole model, downsides include it not working at far distances.

#### Trigger Angle
This is a hack I wrote when InCross wasn't working, however I kind of like it so I kept it for when I want to use it. This checks your crosshair's proximity to the selected bone, and fires if it's within a certain number of units (4 is a safe default for headshots). Upsides include working through wallbang spots and across long distances, downsides include it shooting through non-wallbang spots and it only working on the selected bone.

### RCS

There are two independent RCS systems: Aimbot RCS, and Always RCS. They should be self-descriptive.

### Legit Mode

Legit mode makes it so that when you hold down the triggeraim key, it won't jump to another enemy after they die. So with this on you will need to release and press the key after an enemy dies if you want to aim at a different enemy.

## VAC
As far as anyone knows there's no VAC for linux (yet). However you should take a couple precautions to protect yourself.

    sudo chown root:root vcaim
    sudo chmod 700 vcaim

If you install this with ```make install```, this is done automatically.

## Contributing
Please contribute! Currently I'd love to get the triggerbot fully working again, which would require finding the offset for the crosshair ID / incross. If you know what this is, I'd love to add it back, because

## Known Issues

 * The triggerbot fix is kind of a hack. It doesn't actually check if you're aiming at the enemy, only if you're within X units of the bone you've selected. It has the added benefit(?) of working through walls, though.
 * You'll sometimes aim at enemies that either don't exist or have already died. This is pretty rare, though.

If you experience any other issues, please open an issue for it, or post in the [UnknownCheats](https://www.unknowncheats.me/forum/counterstrike-global-offensive/172239-vcaim-linux-aimbot-based-ekknod-stuffz.html) thread about it. You can also [e-mail me](mailto:vc@cock.li) any time.

## Credits
 * ekknod - original programmer. none of us would be here today if it wasn't for him
 * kudx - fixed RCS when ekknod left, updated offsets for a while
 * andreluis034 - came down from heaven and handed us signatures, updated offsets for a while
 * Ted - put up with my endless questions about IDA for like 2 days


code:
[LINUX CSGO AIM CFG]
AFOV MIN: (15 = 1.5)
100
AFOV MAX: (15 = 1.5)
100
SMOOTH MIN: (150 = 1.5 & 0 = OFF)
0
SMOOTH MAX: (150 = 1.5)
0
AIMBOT RCS ENABLED: (1 = ON, 0 = OFF)
1
ALWAYS RCS ENABLED: (2 = HIGH, 1 = LOW, 0 = OFF)
2
TRIGGER ENABLED: (2 = INCROSS, 1 = TRIGGERANGLE, 0 = 0FF)
2
TRIGGER ANGLE MIN UNITS:
4
BHOP: (1 = ON, 0 = OFF)
1
LEGIT MODE: (1 = ON, 0 = OFF)
1
BONE: (6 = HEAD, 5 = NECK, 4 = CHEST, 0 = DICK)
6


code:
#ifndef MEM_H_INCLUDED
#define MEM_H_INCLUDED
#include <iostream>
#include <fstream>
#include <string.h>
#include <thread>
#include <chrono>
#include <X11/extensions/XTest.h>
#include <sys/uio.h>
#include <math.h>
#include <unistd.h>
#include <stdio.h>

using namespace std;

class mem{
    private:
        struct iovec loc[1];
        struct iovec remo[1];
        pid_t pid;
        char buf[512];
        char cmd[256];
        FILE *maps;
        long unsigned int result = 0;
    public:
        int showpid();
        int checkroot();
        uint32_t getmodule(const char* modname);
        uint32_t getpid(const char * name);
        void read(void* adr, void* bb, size_t size);
        void write(void* adr, void* bb, size_t size);
        char * readtxt(const char * filename, int number);
        int readinteg(const char * filename, int number, string style);
        float readfloat(const char * filename, int number);
        bool fexists(const std::string& name);
};

#endif // MEM_H_INCLUDED


code:
#ifndef PROGRAM_H_INCLUDED
#define PROGRAM_H_INCLUDED
#include "mem.h"
#define	FL_ONGROUND				(1<<0)

class lpx{
public:
    char upd1[0x94]; //0x00
    float pos[2]; //0x94
    char upd2[0xE4-0x94-0x8];
    int team; //0xE4
    char upd3[0xF0-0xE4-0x4]; //0xE8
    int health; //0xF0
    int fflags; //0xF4
    char upd4[0x100-0xF4-0x4];
    float duck; //0x100
    char upd5[0x140-0x100-0x4];
    bool dormant; //0x140
    char upd6[0x24F-0x140-0x1];
    bool lst; //0x24F
    char upd7[0x2FEC-0x24F-0x1];
    float vpuns[2]; //2FEC
    char upd8[0xAA14-0x2FEC-0x8];
    int ch; //AA14
};

class epx{
public:
    char upd1[0x94]; //0x00
    float pos[2]; //0x94
    char upd2[0xE4-0x94-0x8];
    int team; //0xE4
    char upd3[0xF0-0xE4-0x4]; //0xE8
    int health; //0xF0
    char upd4[0x100-0xF0-0x4];
    float duck; //0x100
    char upd5[0x140-0x100-0x4];
    bool dormant; //0x140
    char upd6[0x24F-0x140-0x1];
    bool lst; //0x24F
    char upd7[0x2688-0x24F-0x1]; //2428
    unsigned int bm; //0x42A8
    char upd8[0x3868-0x2688-0x4];
    bool immunity;
    //2698
};

class program{
private:
    mem m;
    Display * dpy;
    lpx lp;
    epx ep;
    epx eps[32];

    const char * configFile;
    const char * offsetFile;

    unsigned int epadr=0;
    unsigned int lpadr=0;
    unsigned int engp=0;

    uint32_t cdl=0;
    uint32_t edl=0;

    int lpofs=0, epofs = 0;
    int alt1ofs = 0, alt2ofs = 0, engpofs = 0;
    int setvangofs=0;

    int keynum = 0;

    int triggerEnabled=0;
    int rcsEnabled=0;
    int alwaysRCSEnabled=0;
    bool smoothEnabled=0;
    int bhopEnabled=0;
    int legitModeEnabled=0;

    int aimingAtId=0;

    bool isaiming;

    int alt1=0, alt2=0, loop=0;

    float vang[2]{0, 0};
    float fbone[2]{0, 0};
    float aiang[2]{0, 0};

    float bonebone[32][3][4];

    float finall[2]{0, 0};

    float fov[2]{0, 0};

    float smoothvalue = 0;
    float smoothed[2]{0, 0};
    int smoothMin=0, smoothMax=0;
    int randomSmooth=0;

    float prevAng[2]{0.0,0.0};
    float prevPunch[2]{0.0,0.0};

    float closestAng[2]{0,0};
    float closestDist=-1.0;
    float closestReqAngle=0.0;
    float crosshairDistance=0.0;
    float playerDistance=0.0;
    float reqAngle=0.0;
    int triggerAngleUnits=0;

    int bone = 0;
    double delta[3]{0, 0, 0};
    double hyp = 0;

    void anglesForId(int id);
    void calca(float *src, float *dst, float *angles);
    void setcursor( float * src,  float * vang);

public:

    void aimloop();
    void trigloop();
    void checkloop();

    int run();
};

#endif // PROGRAM_H_INCLUDED


code:
[OFFSETS]
LocalPlayer=
0x0150CAD4
EntityList=
0x05497CE4
Alt1=
0x05935470
Alt2=
0x0593547C
EnginePointer=
0x00EAE60C
SetViewAng=
0x4CF0


code:
#include "program.h"
program p;

void aimloop(){
    for(;;){
        this_thread::sleep_for(chrono::microseconds(500));
        p.aimloop();
    }
}
void trigloop(){
    for(;;){
        this_thread::sleep_for(chrono::microseconds(500));
        p.trigloop();
    }
}
void checkloop(){
    for(;;){
        this_thread::sleep_for(chrono::milliseconds(300));
        p.checkloop();
    }
}

int main()
{
    p.run();
    thread aloop(aimloop);
    thread tloop(trigloop);
    thread cloop(checkloop);
    aloop.join();
    return 0;
}


code:
#include "mem.h"
#include <sys/stat.h>
#include <unistd.h>

int mem::showpid(){
        if(pid != 0){
            return pid;
        }
        else cout << "process not found!" << endl; exit(0);
}

int mem::checkroot(){
        if (getuid() != 0) {
            cout << "run as root!" << endl;
            exit(0);
        }
        else return true;
}

uint32_t mem::getmodule(const char * modname){
        snprintf(cmd, 256, "grep \"%s\" /proc/%i/maps | head -n 1 | cut -d \"-\" -f1", modname, pid);
        maps = popen(cmd, "r");
        if(maps) {
            if(fscanf(maps, "%08lx", &result));
        }
        pclose(maps);
        return result;
}

uint32_t mem::getpid(const char * name){
        snprintf(buf, 512, "pidof -s %s", name);
        maps = popen(buf, "r");
        if(maps){
            if(fgets(buf, 512, maps));
        }

        pid = strtoul(buf, NULL, 10);

        pclose( maps );
        return pid;
}

void mem::read(void * adr, void * bb, size_t size){
        loc[0].iov_base = bb;
        loc[0].iov_len = size;
        remo[0].iov_base = adr;
        remo[0].iov_len = size;
        (process_vm_readv(pid, loc, 1, remo, 1, 0) == (signed)size);
}

void mem::write(void * adr, void * bb, size_t size){
        loc[0].iov_base = bb;
        loc[0].iov_len = size;
        remo[0].iov_base = adr;
        remo[0].iov_len = size;
        (process_vm_writev(pid, loc, 1, remo, 1, 0) == (signed)size);
}

int mem::readinteg(const char * filename, int number, string style){
    fstream file (filename);
    string ln;
    if(file.is_open()){
        for(int i = 1; getline(file, ln); i++){
            if(i == number){
                int result = 0;
                if(style == "dec"){result = stoi(ln);}
                else if(style == "hex"){result = stoi(ln, nullptr, 16);}
                else{
                    file.close();
                    return 0;
                }
                file.close();
                return result;
            }

        }
    }
    return 0;
}

char * mem::readtxt(const char * filename, int number){
	fstream file (filename);
    string ln;
    if(file.is_open()){
        for(int i = 1; getline(file, ln); i++){
            if(i == number){
                char * result = new char[ln.length() + 1];
                strcpy(result, ln.c_str());
                file.close();
                return result;
            }
        }
    }
    return 0;
}

float mem::readfloat(const char * filename, int number){
	fstream file (filename);
    string ln;
    if(file.is_open()){
        for(int i = 1; getline(file, ln); i++){
            if(i == number){
				size_t sizetyp;
                float result = stof (ln,&sizetyp);
                file.close();
                return result;
            }
        }
    }
    return 0;
}

bool mem::fexists (const std::string& name) {
  struct stat buffer;
  return (stat (name.c_str(), &buffer) == 0);
}


code:
#include "program.h"
#include <cmath>

/**
 * Calculate angles
 */

void program::calca(float * src, float* dst, float* angles){
    // Angle deltas
    double delta[3] = { (src[0]-dst[0]), (src[1]-dst[1]), (src[2]-dst[2]) };

    // Hypotenuse
    hyp = sqrt(delta[0]*delta[0] + delta[1]*delta[1]);

    // dank memes
    angles[0] = (float) (atan(delta[2]/hyp) * 57.295779513082f);
    angles[1] = (float) (atan(delta[1]/delta[0]) * 57.295779513082f);
    angles[2] = 0.0f;

    if(delta[0] >= 0.0) { angles[1] += 180.0f; }

    // Angle safeguards
    if(angles[1] > 180)angles[1] -= 360;
    if(angles[1] < -180)angles[1] += 360;
    if(angles[0] > 89)angles[0] = 89;
    if(angles[0] < -89)angles[0] = -89;
}

/**
 * Set view angles, with optional smoothing
 */

void program::setcursor(float* src, float* vang){

    // Smoothing
    if(smoothEnabled == true) {
        src[0] -= vang[0];
        src[1] -= vang[1];

        smoothed[0] = ((src[0]) / smoothvalue) + vang[0];
        smoothed[1] = ((src[1]) / smoothvalue) + vang[1];

        // You know. Just in case.
        if(smoothed[1] > 180)smoothed[1] -= 360;
        if(smoothed[1] < -180)smoothed[1] += 360;
        if(smoothed[0] > 89)smoothed[0] = 89;
        if(smoothed[0] < -89)smoothed[0] = -89;

        // idk what this does tbh fam
        finall[0] =  (((vang[0] - smoothed[0])* -1));
        finall[1] = (((vang[1] - smoothed[1])));

        if(finall[1] > -fov[0]/smoothvalue && finall[1] < fov[0]/smoothvalue && finall[0] > -fov[1]/smoothvalue && finall[0] < fov[1]/smoothvalue){
            // Write angles to memory
            m.write((void*)(engp + setvangofs), &smoothed[0], sizeof(smoothed[0]));
            m.write((void*)(engp + setvangofs + 0x4), &smoothed[1], sizeof(smoothed[1]));
        }
    } else { // smoot=false

        finall[0] =  (((vang[0] - src[0])* -1));
        finall[1] = (((vang[1] - src[1])));

        if(finall[1] > -fov[0] && finall[1] < fov[0] && finall[0] > -fov[1] && finall[0] < fov[1]){
            // Write angles to memory
            m.write((void*)(engp + setvangofs), &src[0], sizeof(src[0]));
            m.write((void*)(engp + setvangofs + 0x4), &src[1], sizeof(src[1]));
        }
    }
}

void program::anglesForId(int id) {
    ep = eps[id];

    fbone[0] = bonebone[id][0][3];
    fbone[1] = bonebone[id][1][3];
    fbone[2] = bonebone[id][2][3]-lp.duck;

    // If target isn't friendly, if both are dead, dunno what lst or dormant are
    if(lp.team != ep.team && lp.health > 0 && ep.health > 0 && ep.lst == 0 && lp.lst == 0 && lp.dormant == 0 && ep.immunity == 0)
    {
        calca(lp.pos, fbone, aiang);

        // RCS
        if(rcsEnabled == true) {
            aiang[0] = aiang[0] - lp.vpuns[0] * 2.0f;
            aiang[1] = aiang[1] - lp.vpuns[1] * 2.0f;
        }

        // Calculates the distance between the crosshair and the target
        crosshairDistance=sqrt(((aiang[0] - vang[0]) * (aiang[0] - vang[0])) + ((aiang[1] - vang[1]) * (aiang[1] - vang[1])));

        // Calculates the distance between the target and the player
        playerDistance=sqrt(((lp.pos[0]-fbone[0])*(lp.pos[0]-fbone[0]))+((lp.pos[1]-fbone[1])*(lp.pos[1]-fbone[1]))+((lp.pos[2]-bonebone[id][2][3]+lp.duck)*(lp.pos[2]-bonebone[id][2][3]+lp.duck)));

        // Required angle to satisfy triggerAngleUnits
        reqAngle=acos( ( ( 2*(playerDistance*playerDistance) ) - (triggerAngleUnits*triggerAngleUnits))/(2*playerDistance*playerDistance) ) * (180/M_PI);

        // If crosshair is closer than the closest seen target, set this
        // target to be the closest instead.
        if(closestDist==-1.0 || crosshairDistance < closestDist) {
          closestAng[0] = aiang[0];
          closestAng[1] = aiang[1];
          closestDist = crosshairDistance;
          closestReqAngle = reqAngle;
          aimingAtId = id;
        }
    }
}

/**
 * Aimloop, runs the aimbot
 */

void program::aimloop(){
    isaiming=false;

    closestAng[0] = 0.0; closestAng[1] = 0.0;
    closestDist = -1.0;
    closestReqAngle = 0.0;
    crosshairDistance = 0.0;
    playerDistance = 0.0;
    reqAngle = 0.0;

    smoothvalue = randomSmooth / 10;

    // Read memory for memes
    m.read((void*)(cdl + lpofs), &lpadr, sizeof(lpadr));
    m.read((void*)(lpadr), &lp, sizeof(lp));
    m.read((void*)(cdl + alt1ofs), &alt1, sizeof(alt1));
    m.read((void*)(cdl + alt2ofs), &alt2, sizeof(alt2));
    m.read((void*)(edl + engpofs), &engp, sizeof(engp));
    m.read((void*)(engp + setvangofs), &vang, sizeof(vang));

    // AlwaysRCS
    if(alwaysRCSEnabled != 0) {
        if(lp.vpuns[0] != prevPunch[0] || lp.vpuns[1] != prevPunch[1]) {
            // Low
            if(alwaysRCSEnabled == 1) {
                prevAng[0] = vang[0] - (lp.vpuns[0] - prevPunch[0]);
                prevAng[1] = vang[1] - (lp.vpuns[1] - prevPunch[1]);
            }
            // High
            else {
                prevAng[0] = vang[0] - (lp.vpuns[0] - prevPunch[0]) * 2.0f;
                prevAng[1] = vang[1] - (lp.vpuns[1] - prevPunch[1]) * 2.0f;
            }

            // vpuns is sometimes 0.0 when it shouldn't be, so I check for it here.
            if(lp.vpuns[0] != 0.0 && lp.vpuns[1] != 0.0 || abs(prevPunch[0])+abs(prevPunch[1]) < 0.1) {
                prevPunch[0] = lp.vpuns[0];
                prevPunch[1] = lp.vpuns[1];

                setcursor(prevAng,vang);
            }
        }
    }

    // Loop to 32 since we're not reading how many players there are :/
    bzero(&eps,sizeof(eps));
    for(loop = 0; loop < 32; loop++) {
        m.read((void*)(cdl + epofs + loop * 0x10), &epadr, sizeof(epadr));
        m.read((void*)(epadr), &ep, sizeof(ep));
        m.read((void*)(ep.bm + bone * 0x30), &bonebone[loop], sizeof(bonebone[loop]));
        eps[loop] = ep;
    }
    if(aimingAtId == 0 && alt1 == 5 || !legitModeEnabled) {
        for(loop = 0; loop < 32; loop++){
            anglesForId(loop);
        }
    } else {
      anglesForId(aimingAtId);
    }

    // Only aim at the closest enemy.
    if(closestDist != -1.0) {
        if(alt1 == 5){
            setcursor(closestAng, vang);
            if(closestDist < closestReqAngle || triggerEnabled == 2) {
              isaiming = true;
            }
            this_thread::sleep_for(chrono::milliseconds(10));
            // Prevents bug where, even after calculating the closest angle,
            // crosshair always jumps to player with lowest ID. If anyone
            // knows how to fix this, I'd like to remove this wait.
        }
    }
    if(alt1 != 5) {
        aimingAtId = 0;
    }
}

/**
 * Trigloop, runs the triggerbot and bhop script
 */

void program::trigloop(){
    // how about you flush this dick
    XFlush(dpy);

    // Trigger
    if(triggerEnabled != 0){
        if((lp.ch > 0 && lp.ch < 32 && alt1 == 5 && eps[lp.ch].team != lp.team && eps[lp.ch].team != 0 && eps[lp.ch].immunity == 0) || (triggerEnabled==1 && isaiming==true)){
            XTestFakeButtonEvent(dpy, Button1, true, 0);
            this_thread::sleep_for(chrono::milliseconds(1));
            XTestFakeButtonEvent(dpy, Button1, false, 0);
            this_thread::sleep_for(chrono::milliseconds(20)); // Saves the pistol from getting stuck
        }
    }

    // Bhop
    if(bhopEnabled == true){
        if(alt2 == 5 && lp.fflags & FL_ONGROUND){
            XTestFakeKeyEvent(dpy, keynum, true, 0);
            this_thread::sleep_for(chrono::milliseconds(1));
            XTestFakeKeyEvent(dpy, keynum, false, 0);
        }
    }
}

/**
 * Checkloop, makes sure CS:GO is running, generates random smooth (useful
 * because it's on another thread)
 */

void program::checkloop(){
  m.getpid("csgo_linux");
  m.showpid();
  randomSmooth = (rand()%(smoothMax-smoothMin+1)) + smoothMin;
}

/**
 * Sets up the program, reads config.ini, offsets,ini, and finds library offsets
 */

int program::run(){

    cout << ""
        " -----------------------------------\n"
        "|             VC's Aim              |\n"
        "|           SO: Ted, Kudx           |\n"
        "|        Originally by Ekknod       |\n"
        "| Ekknod's credits: Cre3per, s0beit |\n"
        " -----------------------------------\n\n";

    // Do we have root?
    m.checkroot();
    m.getpid("csgo_linux");
    // Make sure CS:GO is running
    m.showpid();

    if(m.fexists("../config.ini"))
      configFile = "../config.ini";
    else if(m.fexists("./config.ini"))
      configFile = "./config.ini";
    else if(m.fexists("/usr/local/etc/vcaim/config.ini"))
      configFile = "/usr/local/etc/vcaim/config.ini";
    else {
      printf("Config file doesn't exist, tried '../config.ini', './config.ini' and '/usr/local/etc/vcaim/config.ini'.\n");
      exit(EXIT_FAILURE);
    }

    if(m.fexists("../offsets.ini"))
      offsetFile = "../offsets.ini";
    if(m.fexists("./offsets.ini"))
      offsetFile = "./offsets.ini";
    else if(m.fexists("/usr/local/etc/vcaim/offsets.ini"))
      offsetFile = "/usr/local/etc/vcaim/offsets.ini";
    else {
      printf("Offset file doesn't exist, tried '../offsets.ini', './offsets.ini' and '/usr/local/etc/vcaim/offsets.ini'.\n");
      exit(EXIT_FAILURE);
    }

    // Config
    fov[0] = m.readinteg(configFile, 3, "dec") / 10;
    fov[1] = m.readinteg(configFile, 5,"dec") / 10;
    smoothMin = m.readinteg(configFile, 7,"dec");
    smoothMax = m.readinteg(configFile, 9,"dec");
    rcsEnabled = m.readinteg(configFile, 11,"dec");
    alwaysRCSEnabled = m.readinteg(configFile, 13,"dec");
    triggerEnabled = m.readinteg(configFile, 15,"dec");
    triggerAngleUnits = m.readinteg(configFile, 17,"dec");
    bhopEnabled = m.readinteg(configFile, 19, "dec");
    legitModeEnabled = m.readinteg(configFile, 21, "dec");
    bone = m.readinteg(configFile, 23, "dec");

    printf("Configuration loaded\n");
    printf("Min FOV: %f\n",fov[0]);
    printf("Max FOV: %f\n",fov[1]);
    printf("Min Smooth: %d\n",smoothMin);
    printf("Max Smooth: %d\n",smoothMax);
    printf("RCS: %d\n",rcsEnabled);
    printf("Trigger enabled: %d\n",triggerEnabled);
    printf("Trigger angle units: %d\n",triggerAngleUnits);
    printf("Bhop: %d\n",bhopEnabled);
    printf("Bone: %d\n\n",bone);

    // Offsets
    lpofs = m.readinteg(offsetFile, 3, "hex");
    epofs = m.readinteg(offsetFile, 5, "hex");
    alt1ofs = m.readinteg(offsetFile, 7, "hex");
    alt2ofs = m.readinteg(offsetFile, 9, "hex");
    engpofs = m.readinteg(offsetFile, 11, "hex");
    setvangofs = m.readinteg(offsetFile, 13, "hex");

    // Config safeguards
    if(fov[0] <= 0)fov[0] = 0;
    if(fov[1] <= 0)fov[0] = 0;
    if(rcsEnabled > 1)rcsEnabled = 1;
    if(rcsEnabled < 1)rcsEnabled = 0;
    if(triggerEnabled < 1)triggerEnabled=0;
    if(bhopEnabled > 1)bhopEnabled = 1;
    if(bhopEnabled <= 0)bhopEnabled = 0;
    if(legitModeEnabled > 1)legitModeEnabled = 1;
    if(legitModeEnabled <= 0)legitModeEnabled = 0;
    smoothEnabled = true;
    if(smoothMin <= 0)smoothEnabled = false;

    // Find engine offsets
    cdl = m.getmodule("csgo/bin/client_client.so");
    edl = m.getmodule("bin/engine_client.so");

    // Open the X server
    dpy = XOpenDisplay(NULL);

    // Make sure engines were found
    if(!cdl)return false;
    if(!edl)return false;
    if(!dpy)return false;

    printf("Modules found in memory, let's do this\n");

    // I should probably move this
    keynum = XKeysymToKeycode(dpy, 0x020); //keynum space = 65 in nordic keyboard

    return Success;
}


code:
#ignore all files...
*

#except...
!.gitignore
!/403/
!/404/
!/banned/
!/banners/
!/css/
!/error/
!/fonts/
!/img/
!/inc/
!/js/
!/libs/
!/modules/

!*.html
8ch.html
index.html
news.html
rules.html
monarchy.html
faq.html
formatting.html
!LICENSE
!README.md
!*.php
config.php
status.php
s.php
!*.sql

path: .gitignore

license: mit


code:
<!doctype html>

            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0"/>
			<meta charset="UTF-8">
			<title>314chan | Forbidden</title>
            <link href="/css/MIcons.css" rel="stylesheet">
            <link href="/css/materialize.css" type="text/css" rel="stylesheet" media="screen,projection"/>
            <link href="/css/style.css" type="text/css" rel="stylesheet" media="screen,projection"/>

314chan

Rules

FAQ

News

IRC

Rules

FAQ

News

IRC

						menu

403 - Forbidden


code:
    <title>314chan 403s</title>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

    <link rel="shortcut icon" href="/favicon.ico" />

    <link rel="stylesheet" type="text/css" href="/css/img_globals.css">

    <link rel="stylesheet" type="text/css" href="/css/front.css" />

    <link rel="stylesheet" type="text/css" href="/css/site_front.css" />

    <link rel="stylesheet" type="text/css" href="/css/site_global.css">

    <link rel="stylesheet" type="text/css" href="/css/futaba.css" title="futaba">

Upload a 403 image for review:

<form action="upload.php" method="post"

enctype="multipart/form-data">

File:

<input type="file" name="file" id="file">

<input type="submit" name="submit" value="Submit">

</form>

403s currently in rotation:

<?php

ini_set('display_errors', '1');

$files = glob("*.{png,jpg,jpeg,gif}", GLOB_BRACE);

// $files = glob("*.gif");

for ($i = 1;$i < count($files);$i++) {

    $num = $files[$i];

    echo '' . "  ";

}

?>


code:
<?php

/*

    DOWNLOADED FROM http://www.marcofolio.net/

    Check it out for more interesting scripts & downloads

    AUTOMATIC IMAGE ROTATOR

    Version 2.2 - December 4, 2003

    Copyright (c) 2002-2003 Dan P. Benjamin, Automatic, Ltd.

    All Rights Reserved.

    http://www.hiveware.com/imagerotator.php

    http://www.automaticlabs.com/

    DISCLAIMER

    Automatic, Ltd. makes no representations or warranties about

    the suitability of the software, either express or

    implied, including but not limited to the implied

    warranties of merchantability, fitness for a particular

    purpose, or non-infringement. Dan P. Benjamin and Automatic, Ltd.

    shall not be liable for any damages suffered by licensee

    as a result of using, modifying or distributing this

    software or its derivatives.

    ABOUT

    This PHP script will randomly select an image file from a

    folder of images on your webserver.  You can then link to it

    as you would any standard image file and you'll see a random

    image each time you reload.

    When you want to add or remove images from the rotation-pool,

    just add or remove them from the image rotation folder.

    VERSION CHANGES

    Version 1.0

        - Release version

    Version 1.5

        - Tweaked a few boring bugs

    Version 2.0

        - Complete rewrite from the ground-up

        - Made it clearer where to make modifications

        - Made it easier to specify/change the rotation-folder

        - Made it easier to specify/change supported image types

        - Wrote better instructions and info (you're them reading now)

        - Significant speed improvements

        - More error checking

        - Cleaner code (albeit more PHP-specific)

        - Better/faster random number generation and file-type parsing

        - Added a feature where the image to display can be specified

        - Added a cool feature where, if an error occurs (such as no

          images being found in the specified folder) *and* you're

          lucky enough to have the GD libraries compiled into PHP on

          your webserver, we generate a replacement "error image" on

          the fly.

    Version 2.1

        - Updated a potential security flaw when value-matching

          filenames

    Version 2.2

        - Updated a few more potential security issues

        - Optimized the code a bit.

        - Expanded the doc for adding new mime/image types.

        Thanks to faithful ALA reader Justin Greer for

        lots of good tips and solid code contribution!

    INSTRUCTIONS

    1. Modify the $folder setting in the configuration section below.

    2. Add image types if needed (most users can ignore that part).

    3. Upload this file (rotate.php) to your webserver.  I recommend

       uploading it to the same folder as your images.

    4. Link to the file as you would any normal image file, like this:

    5. You can also specify the image to display like this:

        This would specify that an image named "gorilla.jpg" located

        in the image-rotation folder should be displayed.

    That's it, you're done.

*/

/* ------------------------- CONFIGURATION -----------------------

    Set $folder to the full path to the location of your images.

    For example: $folder = '/user/me/example.com/images/';

    If the rotate.php file will be in the same folder as your

    images then you should leave it set to $folder = '.';

*/

$folder = '.';

/*

    Most users can safely ignore this part.  If you're a programmer,

    keep reading, if not, you're done.  Go get some coffee.

    If you'd like to enable additional image types other than

    gif, jpg, and png, add a duplicate line to the section below

    for the new image type.

    Add the new file-type, single-quoted, inside brackets.

    Add the mime-type to be sent to the browser, also single-quoted,

    after the equal sign.

    For example:

    PDF Files:

        $extList['pdf'] = 'application/pdf';

    CSS Files:

        $extList['css'] = 'text/css';

    You can even serve up random HTML files:

        $extList['html'] = 'text/html';

        $extList['htm'] = 'text/html';

    Just be sure your mime-type definition is correct!

*/

$extList = array();

$extList['gif'] = 'image/gif';

$extList['jpg'] = 'image/jpeg';

$extList['jpeg'] = 'image/jpeg';

$extList['png'] = 'image/png';

// You don't need to edit anything after this point.

// --------------------- END CONFIGURATION -----------------------

$img = null;
if (substr($folder, -1) != '/') {
    $folder = $folder . '/';
}
if (isset($_GET['img'])) {
    $imageInfo = pathinfo($_GET['img']);
    if (isset($extList[strtolower($imageInfo['extension']) ]) && file_exists($folder . $imageInfo['basename'])) {
        $img = $folder . $imageInfo['basename'];
    }
} else {
    $fileList = array();
    $handle = opendir($folder);
    while (false !== ($file = readdir($handle))) {
        $file_info = pathinfo($file);
        if (isset($extList[@strtolower($file_info['extension']) ])) {
            $fileList[] = $file;
        }
    }
    closedir($handle);
    if (count($fileList) > 0) {
        $imageNumber = time() % count($fileList);
        $img = $folder . $fileList[$imageNumber];
    }
}
if ($img != null) {
    $imageInfo = pathinfo($img);
    $contentType = 'Content-type: ' . $extList[$imageInfo['extension']];
    header($contentType);
    readfile($img);
} else {
    if (function_exists('imagecreate')) {
        header("Content-type: image/png");
        $im = @imagecreate(100, 100) or die("Cannot initialize new GD image stream");
        $background_color = imagecolorallocate($im, 255, 255, 255);
        $text_color = imagecolorallocate($im, 0, 0, 0);
        imagestring($im, 2, 5, 5, "IMAGE ERROR", $text_color);
        imagepng($im);
        imagedestroy($im);
    }
}


code:
<?php

//dont change these, dont even think about adding "bmp" support, it will rape you in the ass

$EXTENSIONS = 'gif,jpg,jpeg,png';

if (isset($_GET["board"]) ? $folder = 'images/' . $_GET["board"] . "/" : $folder = 'images/') {
}

$fileList = array();

$handle = opendir($folder);

while (false !== ($file = readdir($handle))) {

    $file_info = pathinfo($file);

    if ($file != "." && $file != "..") {

        if (strstr($file, ".") && strstr($EXTENSIONS, strtolower($file_info['extension']))) {

            $fileList[] = $file;

        } elseif (!isset($_GET["board"])) {

            $handle2 = opendir($folder . $file);

            while (false !== ($file = readdir($handle2))) {

                $file_info = pathinfo($file);

                if ($file != "." && $file != "..") {

                    if (strstr($file, ".") && strstr($EXTENSIONS, strtolower($file_info['extension']))) {

                        $fileList[] = $file;

                    }

                }

            }

        }

    }

}

closedir($handle);

if (count($fileList) > 0 ? $img = $folder . $fileList[rand(0, count($fileList) - 1) ] : die()) {
}

$imageInfo = pathinfo($img);

header('Content-type: image/' . ($imageInfo['extension'] == 'jpg' ? 'jpeg' : $imageInfo['extension']));

readfile($img);


code:
    <title>314chan Banners</title>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

    <link rel="shortcut icon" href="/favicon.ico" />

    <link rel="stylesheet" type="text/css" href="/css/img_globals.css">

    <link rel="stylesheet" type="text/css" href="/css/front.css" />

    <link rel="stylesheet" type="text/css" href="/css/site_front.css" />

    <link rel="stylesheet" type="text/css" href="/css/site_global.css">

    <link rel="stylesheet" type="text/css" href="/css/futaba.css" title="futaba">

<?php
    ini_set('display_errors', 1);
$allowedExts = array("jpg", "jpeg", "gif", "png");

$extension = end(explode(".", $_FILES["file"]["name"]));

// Image size

$test = getimagesize($_FILES["file"]["tmp_name"]);

$width = $test[0];

$height = $test[1];

// end image size

if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/pjpeg") || ($_FILES["file"]["type"] == "image/x-png") || ($_FILES["file"]["type"] == "image/png")) && in_array($extension, $allowedExts)) {

    if ($_FILES["file"]["error"] > 0) {

        echo "Return Code: " . $_FILES["file"]["error"] . "
";

        die();

    } else {

        if (file_exists("upload/" . $_FILES["file"]["name"]) || file_exists($_FILES["file"]["name"])) {

            echo $_FILES["file"]["name"] . " already exists. ";

        } //else if ($width > 300 || $height > 100) {

            //echo '
This image is larger than 300x100, right? Fix it.
';

            //die();

    } else {

        move_uploaded_file($_FILES["file"]["tmp_name"], "" . $_FILES["file"]["name"]);

        echo "
Thanks! '" . $_FILES["file"]["name"] . "' has been uploaded.
";

    }

}

} else {

    echo "Invalid file";

}


code:
<!doctype html>

            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0"/>
			<meta charset="UTF-8">
			<title>314chan | Not Found</title>
            <link href="/css/MIcons.css" rel="stylesheet">
            <link href="/css/materialize.css" type="text/css" rel="stylesheet" media="screen,projection"/>
            <link href="/css/style.css" type="text/css" rel="stylesheet" media="screen,projection"/>

314chan

Rules

FAQ

News

IRC

Rules

FAQ

News

IRC

						menu

404 - Not Found


code:
    <title>314chan 404s</title>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

    <link rel="shortcut icon" href="/favicon.ico" />

    <link rel="stylesheet" type="text/css" href="/css/img_globals.css">

    <link rel="stylesheet" type="text/css" href="/css/front.css" />

    <link rel="stylesheet" type="text/css" href="/css/site_front.css" />

    <link rel="stylesheet" type="text/css" href="/css/site_global.css">

    <link rel="stylesheet" type="text/css" href="/css/futaba.css" title="futaba">

Upload a 404 image for review:

<form action="upload.php" method="post"

enctype="multipart/form-data">

File:

<input type="file" name="file" id="file">

<input type="submit" name="submit" value="Submit">

</form>

404s currently in rotation:

<?php

ini_set('display_errors', '1');

$files = glob("*.{png,jpg,jpeg,gif}", GLOB_BRACE);

// $files = glob("*.gif");

for ($i = 1;$i < count($files);$i++) {

    $num = $files[$i];

    echo '' . "  ";

}

?>