public void Start() { this.input = this.GetComponent <InputBankTest>(); this.ml = this.gameObject.GetComponent <ModelLocator>(); this.modelTransform = this.ml.modelTransform; this.aa = this.modelTransform.GetComponent <AimAnimator>(); this.refCannonTransform = this.modelTransform; this.cannonTransform = this.modelTransform.Find("CannonPivot"); this.headTransform = this.cannonTransform.Find("AncientWispArmature").Find("Head"); //this.headCollider = this.headTransform.GetComponent<Collider>(); //if( !this.headCollider || this.headCollider.enabled == false ) //{ // Main.LogW( "Head col not found, checking children" ); // this.headCollider = this.headTransform.GetComponentInChildren<Collider>(); // if( this.headCollider.enabled == false ) // { // Main.LogW( "No enabled head colliders" ); // this.headCollider = null; // } //} this.refHeadTransform = this.modelTransform; this.baseCannonRot = this.cannonTransform.localRotation; this.baseCannonPos = this.cannonTransform.localPosition; this.baseHeadRot = this.headTransform.localRotation; this.baseHeadPos = this.headTransform.localPosition; this.offset1 = this.headTransform.position; this.offset1 = this.modelTransform.InverseTransformPoint(this.offset1); }
// Token: 0x06000936 RID: 2358 RVA: 0x0002E588 File Offset: 0x0002C788 public override void OnEnter() { base.OnEnter(); this.modelAnimator = base.GetModelAnimator(); this.modelTransform = base.GetModelTransform(); Util.PlaySound(FireSunder.initialAttackSoundString, base.gameObject); this.duration = FireSunder.baseDuration / this.attackSpeedStat; base.PlayCrossfade("Body", "FireSunder", "FireSunder.playbackRate", this.duration, 0.2f); if (base.characterBody) { base.characterBody.SetAimTimer(this.duration + 2f); } if (this.modelTransform) { AimAnimator component = this.modelTransform.GetComponent <AimAnimator>(); if (component) { component.enabled = true; } this.modelChildLocator = this.modelTransform.GetComponent <ChildLocator>(); if (this.modelChildLocator) { GameObject original = FireSunder.chargeEffectPrefab; this.handRTransform = this.modelChildLocator.FindChild("HandR"); if (this.handRTransform) { this.rightHandChargeEffect = UnityEngine.Object.Instantiate <GameObject>(original, this.handRTransform); } } } }
// Token: 0x06000398 RID: 920 RVA: 0x0000E7CC File Offset: 0x0000C9CC public override void OnExit() { Transform modelTransform = base.GetModelTransform(); if (modelTransform) { AimAnimator component = modelTransform.GetComponent <AimAnimator>(); if (component) { component.enabled = false; } } if (base.isAuthority) { if (base.characterMotor) { base.characterMotor.moveDirection = Vector3.zero; } if (base.railMotor) { base.railMotor.inputMoveVector = Vector3.zero; } } base.OnExit(); }
// Token: 0x06002989 RID: 10633 RVA: 0x000AF074 File Offset: 0x000AD274 protected void StartAimMode(Ray aimRay, float duration = 2f, bool snap = false) { if (base.characterDirection && aimRay.direction != Vector3.zero) { if (snap) { base.characterDirection.forward = aimRay.direction; } else { base.characterDirection.moveVector = aimRay.direction; } } if (base.characterBody) { base.characterBody.SetAimTimer(duration); } if (base.modelLocator) { Transform modelTransform = base.modelLocator.modelTransform; if (modelTransform) { AimAnimator component = modelTransform.GetComponent <AimAnimator>(); if (component && snap) { component.AimImmediate(); } } } }
// Token: 0x06000937 RID: 2359 RVA: 0x0002E69C File Offset: 0x0002C89C public override void OnExit() { EntityState.Destroy(this.rightHandChargeEffect); if (this.modelTransform) { AimAnimator component = this.modelTransform.GetComponent <AimAnimator>(); if (component) { component.enabled = true; } } base.OnExit(); }
private static void SetupAimAnimator(GameObject prefab, GameObject model) { AimAnimator aimAnimator = model.AddComponent <AimAnimator>(); aimAnimator.directionComponent = prefab.GetComponent <CharacterDirection>(); aimAnimator.pitchRangeMax = 60f; aimAnimator.pitchRangeMin = -60f; aimAnimator.yawRangeMin = -80f; aimAnimator.yawRangeMax = 80f; aimAnimator.pitchGiveupRange = 30f; aimAnimator.yawGiveupRange = 10f; aimAnimator.giveupDuration = 3f; aimAnimator.inputBank = prefab.GetComponent <InputBankTest>(); }
// Token: 0x060029AB RID: 10667 RVA: 0x000AF8C8 File Offset: 0x000ADAC8 public override void OnEnter() { base.OnEnter(); Animator modelAnimator = base.GetModelAnimator(); if (modelAnimator) { int layerIndex = modelAnimator.GetLayerIndex("Body"); modelAnimator.CrossFadeInFixedTime("AnimatedJump", 0.25f); modelAnimator.Update(0f); this.duration = modelAnimator.GetNextAnimatorStateInfo(layerIndex).length; AimAnimator component = modelAnimator.GetComponent <AimAnimator>(); if (component) { component.enabled = true; } } }
// Token: 0x060031E8 RID: 12776 RVA: 0x000D7250 File Offset: 0x000D5450 public override void OnEnter() { base.OnEnter(); GenericSkill[] components = base.gameObject.GetComponents <GenericSkill>(); for (int i = 0; i < components.Length; i++) { if (components[i].skillName == "FirePistol") { this.skill1 = components[i]; } else if (components[i].skillName == "FireFMJ") { this.skill2 = components[i]; } else if (components[i].skillName == "Roll") { this.skill3 = components[i]; } else if (components[i].skillName == "FireBarrage") { this.skill4 = components[i]; } } this.modelAnimator = base.GetModelAnimator(); this.previousPosition = base.transform.position; if (this.modelAnimator) { int layerIndex = this.modelAnimator.GetLayerIndex("Body"); this.modelAnimator.CrossFadeInFixedTime("Walk", 0.1f, layerIndex); this.modelAnimator.Update(0f); } Transform modelTransform = base.GetModelTransform(); if (modelTransform) { AimAnimator component = modelTransform.GetComponent <AimAnimator>(); if (component) { component.enabled = true; } } }
private void RW_SetupAimAnimator() { AimAnimator aa = this.RW_body.GetComponent <ModelLocator>().modelTransform.GetComponent <AimAnimator>(); aa.directionComponent = this.RW_body.GetComponent <CharacterDirection>(); aa.pitchRangeMin = -45f; aa.pitchRangeMax = 45f; aa.yawRangeMin = -45f; aa.yawRangeMax = 45f; aa.pitchGiveupRange = 20f; aa.yawGiveupRange = 20f; aa.giveupDuration = 4f; aa.raisedApproachSpeed = 1000f; aa.loweredApproachSpeed = 200f; aa.smoothTime = 0.1f; aa.fullYaw = false; aa.aimType = AimAnimator.AimType.Direct; aa.enableAimWeight = false; this.RW_body.AddComponent <WispAimAnimationController>(); }
// Token: 0x060008D5 RID: 2261 RVA: 0x0002C8D8 File Offset: 0x0002AAD8 public override void OnEnter() { base.OnEnter(); this.prepDuration = PrepCharge.basePrepDuration / this.attackSpeedStat; base.characterBody.SetAimTimer(this.prepDuration); base.PlayCrossfade("Body", "PrepCharge", "PrepCharge.playbackRate", this.prepDuration, 0.2f); Util.PlaySound(PrepCharge.enterSoundString, base.gameObject); Transform modelTransform = base.GetModelTransform(); AimAnimator component = modelTransform.GetComponent <AimAnimator>(); if (component) { component.enabled = true; } if (base.characterDirection) { base.characterDirection.moveVector = base.GetAimRay().direction; } if (modelTransform) { ChildLocator component2 = modelTransform.GetComponent <ChildLocator>(); if (component2) { Transform transform = component2.FindChild("ChargeIndicator"); if (transform && PrepCharge.chargeEffectPrefab) { this.chargeEffectInstance = UnityEngine.Object.Instantiate <GameObject>(PrepCharge.chargeEffectPrefab, transform.position, transform.rotation); this.chargeEffectInstance.transform.parent = transform; ScaleParticleSystemDuration component3 = this.chargeEffectInstance.GetComponent <ScaleParticleSystemDuration>(); if (component3) { component3.newDuration = this.prepDuration; } } } } }
internal static void CreatePrefab() { // first clone the commando prefab so we can turn that into our own survivor characterPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterBodies/CommandoBody"), "ExampleSurvivorBody", true, "C:\\Users\\test\\Documents\\ror2mods\\ExampleSurvivor\\ExampleSurvivor\\ExampleSurvivor\\ExampleSurvivor.cs", "CreatePrefab", 151); characterPrefab.GetComponent <NetworkIdentity>().localPlayerAuthority = true; // create the model here, we're gonna replace commando's model with our own GameObject model = CreateModel(characterPrefab); GameObject gameObject = new GameObject("ModelBase"); gameObject.transform.parent = characterPrefab.transform; gameObject.transform.localPosition = new Vector3(0f, -0.81f, 0f); gameObject.transform.localRotation = Quaternion.identity; gameObject.transform.localScale = new Vector3(1f, 1f, 1f); GameObject gameObject2 = new GameObject("CameraPivot"); gameObject2.transform.parent = gameObject.transform; gameObject2.transform.localPosition = new Vector3(0f, 1.6f, 0f); gameObject2.transform.localRotation = Quaternion.identity; gameObject2.transform.localScale = Vector3.one; GameObject gameObject3 = new GameObject("AimOrigin"); gameObject3.transform.parent = gameObject.transform; gameObject3.transform.localPosition = new Vector3(0f, 1.4f, 0f); gameObject3.transform.localRotation = Quaternion.identity; gameObject3.transform.localScale = Vector3.one; Transform transform = model.transform; transform.parent = gameObject.transform; transform.localPosition = Vector3.zero; transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); transform.localRotation = Quaternion.identity; CharacterDirection characterDirection = characterPrefab.GetComponent <CharacterDirection>(); characterDirection.moveVector = Vector3.zero; characterDirection.targetTransform = gameObject.transform; characterDirection.overrideAnimatorForwardTransform = null; characterDirection.rootMotionAccumulator = null; characterDirection.modelAnimator = model.GetComponentInChildren <Animator>(); characterDirection.driveFromRootRotation = false; characterDirection.turnSpeed = 720f; // set up the character body here CharacterBody bodyComponent = characterPrefab.GetComponent <CharacterBody>(); bodyComponent.bodyIndex = -1; bodyComponent.baseNameToken = "EXAMPLESURVIVOR_NAME"; // name token bodyComponent.subtitleNameToken = "EXAMPLESURVIVOR_SUBTITLE"; // subtitle token- used for umbras bodyComponent.bodyFlags = CharacterBody.BodyFlags.ImmuneToExecutes; bodyComponent.rootMotionInMainState = false; bodyComponent.mainRootSpeed = 0; bodyComponent.baseMaxHealth = 90; bodyComponent.levelMaxHealth = 24; bodyComponent.baseRegen = 0.5f; bodyComponent.levelRegen = 0.25f; bodyComponent.baseMaxShield = 0; bodyComponent.levelMaxShield = 0; bodyComponent.baseMoveSpeed = 7; bodyComponent.levelMoveSpeed = 0; bodyComponent.baseAcceleration = 80; bodyComponent.baseJumpPower = 15; bodyComponent.levelJumpPower = 0; bodyComponent.baseDamage = 15; bodyComponent.levelDamage = 3f; bodyComponent.baseAttackSpeed = 1; bodyComponent.levelAttackSpeed = 0; bodyComponent.baseCrit = 1; bodyComponent.levelCrit = 0; bodyComponent.baseArmor = 0; bodyComponent.levelArmor = 0; bodyComponent.baseJumpCount = 1; bodyComponent.sprintingSpeedMultiplier = 1.45f; bodyComponent.wasLucky = false; bodyComponent.hideCrosshair = false; bodyComponent.aimOriginTransform = gameObject3.transform; bodyComponent.hullClassification = HullClassification.Human; bodyComponent.portraitIcon = Assets.charPortrait; bodyComponent.isChampion = false; bodyComponent.currentVehicle = null; bodyComponent.skinIndex = 0U; // the charactermotor controls the survivor's movement and stuff CharacterMotor characterMotor = characterPrefab.GetComponent <CharacterMotor>(); characterMotor.walkSpeedPenaltyCoefficient = 1f; characterMotor.characterDirection = characterDirection; characterMotor.muteWalkMotion = false; characterMotor.mass = 100f; characterMotor.airControl = 0.25f; characterMotor.disableAirControlUntilCollision = false; characterMotor.generateParametersOnAwake = true; characterMotor.useGravity = true; characterMotor.isFlying = false; InputBankTest inputBankTest = characterPrefab.GetComponent <InputBankTest>(); inputBankTest.moveVector = Vector3.zero; CameraTargetParams cameraTargetParams = characterPrefab.GetComponent <CameraTargetParams>(); cameraTargetParams.cameraParams = Resources.Load <GameObject>("Prefabs/CharacterBodies/CommandoBody").GetComponent <CameraTargetParams>().cameraParams; cameraTargetParams.cameraPivotTransform = null; cameraTargetParams.aimMode = CameraTargetParams.AimType.Standard; cameraTargetParams.recoil = Vector2.zero; cameraTargetParams.idealLocalCameraPos = Vector3.zero; cameraTargetParams.dontRaycastToPivot = false; // this component is used to locate the character model(duh), important to set this up here ModelLocator modelLocator = characterPrefab.GetComponent <ModelLocator>(); modelLocator.modelTransform = transform; modelLocator.modelBaseTransform = gameObject.transform; modelLocator.dontReleaseModelOnDeath = false; modelLocator.autoUpdateModelTransform = true; modelLocator.dontDetatchFromParent = false; modelLocator.noCorpse = false; modelLocator.normalizeToFloor = false; // set true if you want your character to rotate on terrain like acrid does modelLocator.preserveModel = false; // childlocator is something that must be set up in the unity project, it's used to find any child objects for things like footsteps or muzzle flashes // also important to set up if you want quality ChildLocator childLocator = model.GetComponent <ChildLocator>(); // this component is used to handle all overlays and whatever on your character, without setting this up you won't get any cool effects like burning or freeze on the character // it goes on the model object of course CharacterModel characterModel = model.AddComponent <CharacterModel>(); characterModel.body = bodyComponent; characterModel.baseRendererInfos = new CharacterModel.RendererInfo[] { // set up multiple rendererinfos if needed, but for this example there's only the one new CharacterModel.RendererInfo { defaultMaterial = model.GetComponentInChildren <SkinnedMeshRenderer>().material, renderer = model.GetComponentInChildren <SkinnedMeshRenderer>(), defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On, ignoreOverlays = false } }; characterModel.autoPopulateLightInfos = true; characterModel.invisibilityCount = 0; characterModel.temporaryOverlays = new List <TemporaryOverlay>(); TeamComponent teamComponent = null; if (characterPrefab.GetComponent <TeamComponent>() != null) { teamComponent = characterPrefab.GetComponent <TeamComponent>(); } else { teamComponent = characterPrefab.GetComponent <TeamComponent>(); } teamComponent.hideAllyCardDisplay = false; teamComponent.teamIndex = TeamIndex.None; HealthComponent healthComponent = characterPrefab.GetComponent <HealthComponent>(); healthComponent.health = 90f; healthComponent.shield = 0f; healthComponent.barrier = 0f; healthComponent.magnetiCharge = 0f; healthComponent.body = null; healthComponent.dontShowHealthbar = false; healthComponent.globalDeathEventChanceCoefficient = 1f; characterPrefab.GetComponent <Interactor>().maxInteractionDistance = 3f; characterPrefab.GetComponent <InteractionDriver>().highlightInteractor = true; // this disables ragdoll since the character's not set up for it, and instead plays a death animation CharacterDeathBehavior characterDeathBehavior = characterPrefab.GetComponent <CharacterDeathBehavior>(); characterDeathBehavior.deathStateMachine = characterPrefab.GetComponent <EntityStateMachine>(); characterDeathBehavior.deathState = new SerializableEntityStateType(typeof(GenericCharacterDeath)); // edit the sfxlocator if you want different sounds SfxLocator sfxLocator = characterPrefab.GetComponent <SfxLocator>(); sfxLocator.deathSound = "Play_ui_player_death"; sfxLocator.barkSound = ""; sfxLocator.openSound = ""; sfxLocator.landingSound = "Play_char_land"; sfxLocator.fallDamageSound = "Play_char_land_fall_damage"; sfxLocator.aliveLoopStart = ""; sfxLocator.aliveLoopStop = ""; Rigidbody rigidbody = characterPrefab.GetComponent <Rigidbody>(); rigidbody.mass = 100f; rigidbody.drag = 0f; rigidbody.angularDrag = 0f; rigidbody.useGravity = false; rigidbody.isKinematic = true; rigidbody.interpolation = RigidbodyInterpolation.None; rigidbody.collisionDetectionMode = CollisionDetectionMode.Discrete; rigidbody.constraints = RigidbodyConstraints.None; CapsuleCollider capsuleCollider = characterPrefab.GetComponent <CapsuleCollider>(); capsuleCollider.isTrigger = false; capsuleCollider.material = null; capsuleCollider.center = new Vector3(0f, 0f, 0f); capsuleCollider.radius = 0.5f; capsuleCollider.height = 1.82f; capsuleCollider.direction = 1; KinematicCharacterMotor kinematicCharacterMotor = characterPrefab.GetComponent <KinematicCharacterMotor>(); kinematicCharacterMotor.CharacterController = characterMotor; kinematicCharacterMotor.Capsule = capsuleCollider; kinematicCharacterMotor.Rigidbody = rigidbody; capsuleCollider.radius = 0.5f; capsuleCollider.height = 1.82f; capsuleCollider.center = new Vector3(0, 0, 0); capsuleCollider.material = null; kinematicCharacterMotor.DetectDiscreteCollisions = false; kinematicCharacterMotor.GroundDetectionExtraDistance = 0f; kinematicCharacterMotor.MaxStepHeight = 0.2f; kinematicCharacterMotor.MinRequiredStepDepth = 0.1f; kinematicCharacterMotor.MaxStableSlopeAngle = 55f; kinematicCharacterMotor.MaxStableDistanceFromLedge = 0.5f; kinematicCharacterMotor.PreventSnappingOnLedges = false; kinematicCharacterMotor.MaxStableDenivelationAngle = 55f; kinematicCharacterMotor.RigidbodyInteractionType = RigidbodyInteractionType.None; kinematicCharacterMotor.PreserveAttachedRigidbodyMomentum = true; kinematicCharacterMotor.HasPlanarConstraint = false; kinematicCharacterMotor.PlanarConstraintAxis = Vector3.up; kinematicCharacterMotor.StepHandling = StepHandlingMethod.None; kinematicCharacterMotor.LedgeHandling = true; kinematicCharacterMotor.InteractiveRigidbodyHandling = true; kinematicCharacterMotor.SafeMovement = false; // this sets up the character's hurtbox, kinda confusing, but should be fine as long as it's set up in unity right HurtBoxGroup hurtBoxGroup = model.AddComponent <HurtBoxGroup>(); HurtBox componentInChildren = model.GetComponentInChildren <CapsuleCollider>().gameObject.AddComponent <HurtBox>(); componentInChildren.gameObject.layer = LayerIndex.entityPrecise.intVal; componentInChildren.healthComponent = healthComponent; componentInChildren.isBullseye = true; componentInChildren.damageModifier = HurtBox.DamageModifier.Normal; componentInChildren.hurtBoxGroup = hurtBoxGroup; componentInChildren.indexInGroup = 0; hurtBoxGroup.hurtBoxes = new HurtBox[] { componentInChildren }; hurtBoxGroup.mainHurtBox = componentInChildren; hurtBoxGroup.bullseyeCount = 1; // this is for handling footsteps, not needed but polish is always good FootstepHandler footstepHandler = model.AddComponent <FootstepHandler>(); footstepHandler.baseFootstepString = "Play_player_footstep"; footstepHandler.sprintFootstepOverrideString = ""; footstepHandler.enableFootstepDust = true; footstepHandler.footstepDustPrefab = Resources.Load <GameObject>("Prefabs/GenericFootstepDust"); // ragdoll controller is a pain to set up so we won't be doing that here.. RagdollController ragdollController = model.AddComponent <RagdollController>(); ragdollController.bones = null; ragdollController.componentsToDisableOnRagdoll = null; // this handles the pitch and yaw animations, but honestly they are nasty and a huge pain to set up so i didn't bother AimAnimator aimAnimator = model.AddComponent <AimAnimator>(); aimAnimator.inputBank = inputBankTest; aimAnimator.directionComponent = characterDirection; aimAnimator.pitchRangeMax = 55f; aimAnimator.pitchRangeMin = -50f; aimAnimator.yawRangeMin = -44f; aimAnimator.yawRangeMax = 44f; aimAnimator.pitchGiveupRange = 30f; aimAnimator.yawGiveupRange = 10f; aimAnimator.giveupDuration = 8f; }
public static void Create() { body = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterBodies/CommandoBody"), "UrsaBody", true); NetworkIdentity networkIdentity = body.GetComponent <NetworkIdentity>(); networkIdentity.localPlayerAuthority = true; GameObject model = CreateModel(body); GameObject gameObject = new GameObject("ModelBase"); gameObject.transform.parent = body.transform; gameObject.transform.localPosition = new Vector3(0f, -0.81f, 0f); gameObject.transform.localRotation = Quaternion.identity; gameObject.transform.localScale = new Vector3(1f, 1f, 1f); GameObject gameObject2 = new GameObject("CameraPivot"); gameObject2.transform.parent = gameObject.transform; gameObject2.transform.localPosition = new Vector3(0f, 1.6f, 0f); gameObject2.transform.localRotation = Quaternion.identity; gameObject2.transform.localScale = Vector3.one; GameObject gameObject3 = new GameObject("AimOrigin"); gameObject3.transform.parent = gameObject.transform; gameObject3.transform.localPosition = new Vector3(0f, 1.4f, 0f); gameObject3.transform.localRotation = Quaternion.identity; gameObject3.transform.localScale = Vector3.one; Transform transform = model.transform; transform.parent = gameObject.transform; transform.localPosition = Vector3.zero; transform.localScale = new Vector3(1f, 1f, 1f); transform.localRotation = Quaternion.identity; CharacterDirection characterDirection = body.GetComponent <CharacterDirection>(); characterDirection.moveVector = Vector3.zero; characterDirection.targetTransform = gameObject.transform; characterDirection.overrideAnimatorForwardTransform = null; characterDirection.rootMotionAccumulator = null; characterDirection.modelAnimator = model.GetComponentInChildren <Animator>(); characterDirection.driveFromRootRotation = false; characterDirection.turnSpeed = 720f; CharacterBody bodyComponent = body.GetComponent <CharacterBody>(); bodyComponent.bodyIndex = BodyIndex.None; bodyComponent.baseNameToken = "URSA_NAME"; bodyComponent.subtitleNameToken = "URSA_SUBTITLE"; bodyComponent.bodyFlags = CharacterBody.BodyFlags.ImmuneToExecutes; bodyComponent.rootMotionInMainState = false; bodyComponent.mainRootSpeed = 0; bodyComponent.baseMaxHealth = Core.Config.baseMaxHealth.Value; bodyComponent.levelMaxHealth = Core.Config.levelMaxHealth.Value; bodyComponent.baseRegen = Core.Config.baseRegen.Value; bodyComponent.levelRegen = Core.Config.levelRegen.Value; bodyComponent.baseMaxShield = Core.Config.baseMaxShield.Value; bodyComponent.levelMaxShield = Core.Config.levelMaxShield.Value; bodyComponent.baseMoveSpeed = Core.Config.baseMoveSpeed.Value; bodyComponent.levelMoveSpeed = Core.Config.levelMoveSpeed.Value; bodyComponent.baseAcceleration = Core.Config.baseAcceleration.Value; bodyComponent.baseJumpPower = Core.Config.baseJumpPower.Value; bodyComponent.levelJumpPower = Core.Config.levelJumpPower.Value; bodyComponent.baseJumpCount = Core.Config.baseJumpCount.Value; bodyComponent.baseDamage = Core.Config.baseDamage.Value; bodyComponent.levelDamage = Core.Config.levelDamage.Value; bodyComponent.baseAttackSpeed = Core.Config.baseAttackSpeed.Value; bodyComponent.levelAttackSpeed = Core.Config.levelAttackSpeed.Value; bodyComponent.baseCrit = Core.Config.baseCrit.Value; bodyComponent.levelCrit = Core.Config.levelCrit.Value; bodyComponent.baseArmor = Core.Config.baseArmor.Value; bodyComponent.levelArmor = Core.Config.levelArmor.Value; bodyComponent.sprintingSpeedMultiplier = Core.Config.sprintingSpeedMultiplier.Value; bodyComponent.wasLucky = false; bodyComponent.hideCrosshair = false; bodyComponent.crosshairPrefab = Resources.Load <GameObject>("prefabs/crosshair/simpledotcrosshair"); bodyComponent.aimOriginTransform = gameObject3.transform; bodyComponent.hullClassification = HullClassification.Human; bodyComponent.portraitIcon = Core.Assets.portrait.texture; bodyComponent.isChampion = false; bodyComponent.currentVehicle = null; bodyComponent.skinIndex = 0U; LoadoutAPI.AddSkill(typeof(States.UrsaMain)); var stateMachine = body.GetComponent <EntityStateMachine>(); stateMachine.mainStateType = new SerializableEntityStateType(typeof(States.UrsaMain)); CharacterMotor characterMotor = body.GetComponent <CharacterMotor>(); characterMotor.walkSpeedPenaltyCoefficient = 1f; characterMotor.characterDirection = characterDirection; characterMotor.muteWalkMotion = false; characterMotor.mass = 200f; characterMotor.airControl = 0.25f; characterMotor.disableAirControlUntilCollision = false; characterMotor.generateParametersOnAwake = true; //characterMotor.useGravity = true; //characterMotor.isFlying = false; InputBankTest inputBankTest = body.GetComponent <InputBankTest>(); inputBankTest.moveVector = Vector3.zero; CameraTargetParams cameraTargetParams = body.GetComponent <CameraTargetParams>(); cameraTargetParams.cameraParams = Resources.Load <GameObject>("Prefabs/CharacterBodies/CommandoBody").GetComponent <CameraTargetParams>().cameraParams; cameraTargetParams.cameraPivotTransform = null; cameraTargetParams.aimMode = CameraTargetParams.AimType.Standard; cameraTargetParams.recoil = Vector2.zero; cameraTargetParams.idealLocalCameraPos = Vector3.zero; cameraTargetParams.dontRaycastToPivot = false; ModelLocator modelLocator = body.GetComponent <ModelLocator>(); modelLocator.modelTransform = transform; modelLocator.modelBaseTransform = gameObject.transform; modelLocator.dontReleaseModelOnDeath = false; modelLocator.autoUpdateModelTransform = true; modelLocator.dontDetatchFromParent = false; modelLocator.noCorpse = false; modelLocator.normalizeToFloor = true; modelLocator.preserveModel = false; ChildLocator childLocator = model.GetComponent <ChildLocator>(); HitBoxGroup rightClawHitBoxGroup = model.AddComponent <HitBoxGroup>(); HitBoxGroup leftClawHitBoxGroup = model.AddComponent <HitBoxGroup>(); GameObject rightClawGameObject = new GameObject("RightClawHitBox"); Transform rightClaw = childLocator.FindChild("R_Hand"); rightClawGameObject.transform.parent = rightClaw; rightClawGameObject.transform.localPosition = new Vector3(-0.2f, 0.2f, 0.3f); rightClawGameObject.transform.localScale = Vector3.one * 6.25f; rightClawGameObject.transform.localRotation = Quaternion.identity; HitBox rightClawHitBox = rightClawGameObject.AddComponent <HitBox>(); GameObject leftClawGameObject = new GameObject("LeftClawHitBox"); Transform leftClaw = childLocator.FindChild("L_Hand"); leftClawGameObject.transform.parent = leftClaw; leftClawGameObject.transform.localPosition = new Vector3(-0.2f, 0.2f, 0.3f); leftClawGameObject.transform.localScale = Vector3.one * 6.25f; leftClawGameObject.transform.localRotation = Quaternion.identity; HitBox leftClawHitBox = leftClawGameObject.AddComponent <HitBox>(); rightClawHitBoxGroup.hitBoxes = new HitBox[] { rightClawHitBox }; rightClawHitBoxGroup.groupName = "RightClaw"; leftClawHitBoxGroup.hitBoxes = new HitBox[] { leftClawHitBox }; leftClawHitBoxGroup.groupName = "LeftClaw"; Light rightLight = rightClaw.gameObject.AddComponent <Light>(); rightLight.type = LightType.Point; rightLight.color = Color.yellow; rightLight.range = 0.85f; rightLight.intensity = 95f; rightLight.enabled = false; Light leftLight = leftClaw.gameObject.AddComponent <Light>(); leftLight.type = LightType.Point; leftLight.color = Color.yellow; leftLight.range = 0.85f; leftLight.intensity = 95f; leftLight.enabled = false; CharacterModel characterModel = model.AddComponent <CharacterModel>(); characterModel.body = bodyComponent; List <CharacterModel.RendererInfo> rendererInfos = new List <CharacterModel.RendererInfo>(); foreach (SkinnedMeshRenderer i in model.GetComponentsInChildren <SkinnedMeshRenderer>()) { CharacterModel.RendererInfo info = new CharacterModel.RendererInfo { defaultMaterial = i.material, renderer = i, defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On, ignoreOverlays = false }; rendererInfos.Add(info); } characterModel.baseRendererInfos = rendererInfos.ToArray(); characterModel.autoPopulateLightInfos = true; characterModel.invisibilityCount = 0; characterModel.temporaryOverlays = new List <TemporaryOverlay>(); ModelSkinController skinController = model.AddComponent <ModelSkinController>(); LoadoutAPI.SkinDefInfo skinDefInfo = new LoadoutAPI.SkinDefInfo { BaseSkins = Array.Empty <SkinDef>(), GameObjectActivations = new SkinDef.GameObjectActivation[0], Icon = Core.Assets.defaultSkinIcon, MeshReplacements = new SkinDef.MeshReplacement[0], MinionSkinReplacements = new SkinDef.MinionSkinReplacement[0], Name = "URSA_SKIN_DEFAULT_NAME", NameToken = "URSA_SKIN_DEFAULT_NAME", ProjectileGhostReplacements = new SkinDef.ProjectileGhostReplacement[0], RendererInfos = rendererInfos.ToArray(), RootObject = model, }; SkinDef skin = LoadoutAPI.CreateNewSkinDef(skinDefInfo); skinController.skins = new SkinDef[] { skin }; TeamComponent teamComponent = null; if (body.GetComponent <TeamComponent>() != null) { teamComponent = body.GetComponent <TeamComponent>(); } else { teamComponent = body.GetComponent <TeamComponent>(); } teamComponent.hideAllyCardDisplay = false; teamComponent.teamIndex = TeamIndex.None; HealthComponent healthComponent = body.GetComponent <HealthComponent>(); healthComponent.health = 90f; healthComponent.shield = 0f; healthComponent.barrier = 0f; healthComponent.magnetiCharge = 0f; healthComponent.body = null; healthComponent.dontShowHealthbar = false; healthComponent.globalDeathEventChanceCoefficient = 1f; body.GetComponent <Interactor>().maxInteractionDistance = 3f; body.GetComponent <InteractionDriver>().highlightInteractor = true; CharacterDeathBehavior characterDeathBehavior = body.GetComponent <CharacterDeathBehavior>(); characterDeathBehavior.deathStateMachine = body.GetComponent <EntityStateMachine>(); characterDeathBehavior.deathState = new SerializableEntityStateType(typeof(GenericCharacterDeath)); SfxLocator sfxLocator = body.GetComponent <SfxLocator>(); sfxLocator.deathSound = "Play_ui_player_death"; sfxLocator.barkSound = ""; sfxLocator.openSound = ""; sfxLocator.landingSound = "Play_char_land"; sfxLocator.fallDamageSound = "Play_char_land_fall_damage"; sfxLocator.aliveLoopStart = ""; sfxLocator.aliveLoopStop = ""; Rigidbody rigidbody = body.GetComponent <Rigidbody>(); rigidbody.mass = 100f; rigidbody.drag = 0f; rigidbody.angularDrag = 0f; rigidbody.useGravity = false; rigidbody.isKinematic = true; rigidbody.interpolation = RigidbodyInterpolation.None; rigidbody.collisionDetectionMode = CollisionDetectionMode.Discrete; rigidbody.constraints = RigidbodyConstraints.None; CapsuleCollider capsuleCollider = body.GetComponent <CapsuleCollider>(); capsuleCollider.isTrigger = false; capsuleCollider.material = null; capsuleCollider.center = new Vector3(0f, 0f, 0f); capsuleCollider.radius = 0.5f; capsuleCollider.height = 1.82f; capsuleCollider.direction = 1; KinematicCharacterMotor kinematicCharacterMotor = body.GetComponent <KinematicCharacterMotor>(); kinematicCharacterMotor.CharacterController = characterMotor; kinematicCharacterMotor.Capsule = capsuleCollider; kinematicCharacterMotor.Rigidbody = rigidbody; capsuleCollider.radius = 0.5f; capsuleCollider.height = 1.82f; capsuleCollider.center = new Vector3(0, 0, 0); capsuleCollider.material = null; kinematicCharacterMotor.DetectDiscreteCollisions = false; kinematicCharacterMotor.GroundDetectionExtraDistance = 0f; kinematicCharacterMotor.MaxStepHeight = 0.2f; kinematicCharacterMotor.MinRequiredStepDepth = 0.1f; kinematicCharacterMotor.MaxStableSlopeAngle = 55f; kinematicCharacterMotor.MaxStableDistanceFromLedge = 0.5f; kinematicCharacterMotor.PreventSnappingOnLedges = false; kinematicCharacterMotor.MaxStableDenivelationAngle = 55f; kinematicCharacterMotor.RigidbodyInteractionType = RigidbodyInteractionType.None; kinematicCharacterMotor.PreserveAttachedRigidbodyMomentum = true; kinematicCharacterMotor.HasPlanarConstraint = false; kinematicCharacterMotor.PlanarConstraintAxis = Vector3.up; kinematicCharacterMotor.StepHandling = StepHandlingMethod.None; kinematicCharacterMotor.LedgeHandling = true; kinematicCharacterMotor.InteractiveRigidbodyHandling = true; kinematicCharacterMotor.SafeMovement = false; HurtBoxGroup hurtBoxGroup = model.AddComponent <HurtBoxGroup>(); HurtBox componentInChildren = model.GetComponentInChildren <CapsuleCollider>().gameObject.AddComponent <HurtBox>(); componentInChildren.gameObject.layer = LayerIndex.entityPrecise.intVal; componentInChildren.healthComponent = healthComponent; componentInChildren.isBullseye = true; componentInChildren.damageModifier = HurtBox.DamageModifier.Normal; componentInChildren.hurtBoxGroup = hurtBoxGroup; componentInChildren.indexInGroup = 0; hurtBoxGroup.hurtBoxes = new HurtBox[] { componentInChildren }; hurtBoxGroup.mainHurtBox = componentInChildren; hurtBoxGroup.bullseyeCount = 1; FootstepHandler footstepHandler = model.AddComponent <FootstepHandler>(); footstepHandler.baseFootstepString = "Play_player_footstep"; footstepHandler.sprintFootstepOverrideString = ""; footstepHandler.enableFootstepDust = true; footstepHandler.footstepDustPrefab = Resources.Load <GameObject>("Prefabs/GenericFootstepDust"); RagdollController ragdollController = model.AddComponent <RagdollController>(); ragdollController.bones = null; ragdollController.componentsToDisableOnRagdoll = null; AimAnimator aimAnimator = model.AddComponent <AimAnimator>(); aimAnimator.inputBank = inputBankTest; aimAnimator.directionComponent = characterDirection; aimAnimator.pitchRangeMax = 55f; aimAnimator.pitchRangeMin = -50f; aimAnimator.yawRangeMin = -44f; aimAnimator.yawRangeMax = 44f; aimAnimator.pitchGiveupRange = 30f; aimAnimator.yawGiveupRange = 10f; aimAnimator.giveupDuration = 8f; // Adds component used for keeping track of individual Ursa's Fury Swipes damage bonus from Enrage. body.AddComponent <Miscellaneous.FurySwipesController>(); // Particle System that only emits when Overpower buff is active. ParticleSystem.EmissionModule overpowerParticleSystemEmission = childLocator.FindChild("OverpowerParticles").GetComponent <ParticleSystem>().emission; overpowerParticleSystemEmission.enabled = false; //Doppelganger doppelgangerMaster = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterMasters/CommandoMonsterMaster"), "UrsaDoppelGanger", true); CharacterMaster component = doppelgangerMaster.GetComponent <CharacterMaster>(); component.bodyPrefab = body; }
internal static void CreatePrefab() { SniperMain.sniperBodyPrefab = PrefabsCore.CreatePrefab("Sniper", true); SniperMain.sniperBodyPrefab.tag = "Finish"; GameObject obj = SniperMain.sniperBodyPrefab; NetworkIdentity netId = obj.AddOrGetComponent <NetworkIdentity>(); netId.localPlayerAuthority = true; var modelBase = new GameObject("ModelBase"); modelBase.transform.parent = obj.transform; modelBase.transform.localPosition = new Vector3(0f, -0.81f, 0f); modelBase.transform.localRotation = Quaternion.identity; modelBase.transform.localScale = new Vector3(1f, 1f, 1f); var cameraPivot = new GameObject("CameraPivot"); cameraPivot.transform.parent = modelBase.transform; cameraPivot.transform.localPosition = new Vector3(0f, 1.6f, 0f); cameraPivot.transform.localRotation = Quaternion.identity; cameraPivot.transform.localScale = Vector3.one; var aimOrigin = new GameObject("AimOrigin"); aimOrigin.transform.parent = modelBase.transform; aimOrigin.transform.localPosition = new Vector3(0f, 1.4f, 0f); aimOrigin.transform.localRotation = Quaternion.identity; aimOrigin.transform.localScale = Vector3.one; GameObject model = ModelModule.GetModel(); Transform modelTransform = model.transform; modelTransform.parent = modelBase.transform; modelTransform.localPosition = Vector3.zero; modelTransform.localScale = Vector3.one; modelTransform.localRotation = Quaternion.identity; CharacterDirection direction = obj.AddOrGetComponent <CharacterDirection>(); direction.moveVector = Vector3.zero; direction.targetTransform = modelBase.transform; direction.overrideAnimatorForwardTransform = null; direction.rootMotionAccumulator = null; direction.modelAnimator = null; direction.driveFromRootRotation = false; direction.turnSpeed = 720f; //CharacterBody borkBorkBody = null; //if(borkBorkBody is null) return; //borkBorkBody.baseMaxHealth = 150f; //borkBorkBody.baseMoveSpeed = 9f; //borkBorkBody.baseJumpPower = 20f; //borkBorkBody.baseDamage = 12f; SniperCharacterBody body = obj.AddOrGetComponent <SniperCharacterBody>(); body.bodyIndex = (BodyIndex)(-1); body.baseNameToken = Tokens.SNIPER_NAME; body.subtitleNameToken = Tokens.SNIPER_SUBTITLE; body.bodyFlags = CharacterBody.BodyFlags.ImmuneToExecutes; body.rootMotionInMainState = false; body.mainRootSpeed = 0f; body.baseMaxHealth = 130f; body.levelMaxHealth = 39f; body.baseRegen = 2f; body.levelRegen = 0.4f; body.baseMaxShield = 0f; body.levelMaxShield = 0f; body.baseMoveSpeed = 7f; body.levelMoveSpeed = 0f; body.baseAcceleration = 60f; body.baseJumpPower = 15f; body.levelJumpPower = 0f; body.baseDamage = 12f; body.levelDamage = 3.6f; body.baseAttackSpeed = 1f; body.levelAttackSpeed = 0f; body.baseCrit = 1f; body.levelCrit = 0f; body.baseArmor = 0f; body.levelArmor = 0f; body.baseJumpCount = 1; body.sprintingSpeedMultiplier = 1.45f; body.wasLucky = false; body.spreadBloomDecayTime = 1f; body.spreadBloomCurve = AnimationCurve.EaseInOut(0f, 0f, 1f, 1f); body.crosshairPrefab = UIModule.GetCrosshair(); body.hideCrosshair = false; body.aimOriginTransform = aimOrigin.transform; body.hullClassification = HullClassification.Human; body.portraitIcon = UIModule.GetPortraitIcon(); body.isChampion = false; body.currentVehicle = null; body.preferredPodPrefab = MiscModule.GetPodPrefab(); body.preferredInitialStateType = SkillsCore.StateType <Uninitialized>(); body.skinIndex = 0u; CharacterMotor motor = obj.AddOrGetComponent <CharacterMotor>(); motor.walkSpeedPenaltyCoefficient = 1f; motor.characterDirection = direction; motor.muteWalkMotion = false; motor.mass = 100f; motor.airControl = 0.25f; motor.disableAirControlUntilCollision = false; motor.generateParametersOnAwake = true; motor.useGravity = true; motor.isFlying = false; InputBankTest input = obj.AddOrGetComponent <InputBankTest>(); input.moveVector = Vector3.zero; CameraTargetParams ctp = obj.AddOrGetComponent <CameraTargetParams>(); ctp.cameraParams = MiscModule.GetCharCameraParams(); ctp.cameraPivotTransform = null; ctp.aimMode = CameraTargetParams.AimType.Standard; ctp.recoil = Vector2.zero; ctp.idealLocalCameraPos = Vector3.zero; ctp.dontRaycastToPivot = false; ModelLocator modelLocator = obj.AddOrGetComponent <ModelLocator>(); modelLocator.modelTransform = modelTransform; modelLocator.modelBaseTransform = modelBase.transform; modelLocator.dontReleaseModelOnDeath = false; modelLocator.autoUpdateModelTransform = true; modelLocator.dontDetatchFromParent = false; modelLocator.noCorpse = false; modelLocator.normalizeToFloor = false; modelLocator.preserveModel = false; EntityStateMachine bodyMachine = obj.AddOrGetComponent <EntityStateMachine>(); bodyMachine.customName = "Body"; bodyMachine.initialStateType = SkillsCore.StateType <SpawnTeleporterState>(); bodyMachine.mainStateType = SkillsCore.StateType <GenericCharacterMain>(); EntityStateMachine weaponMachine = obj.AddComponent <EntityStateMachine>(); weaponMachine.customName = "Weapon"; weaponMachine.initialStateType = SkillsCore.StateType <Idle>(); weaponMachine.mainStateType = SkillsCore.StateType <Idle>(); EntityStateMachine scopeMachine = obj.AddComponent <EntityStateMachine>(); scopeMachine.customName = "Scope"; scopeMachine.initialStateType = SkillsCore.StateType <Idle>(); scopeMachine.mainStateType = SkillsCore.StateType <Idle>(); EntityStateMachine reloadMachine = obj.AddComponent <EntityStateMachine>(); reloadMachine.customName = "Reload"; reloadMachine.initialStateType = SkillsCore.StateType <Idle>(); reloadMachine.mainStateType = SkillsCore.StateType <Idle>(); EntityStateMachine[] allStateMachines = new[] { bodyMachine, weaponMachine, scopeMachine, reloadMachine }; EntityStateMachine[] nonBodyStateMachines = new[] { weaponMachine, scopeMachine, reloadMachine }; GenericSkill ammoSkill = obj.AddOrGetComponent <GenericSkill>(); ammoSkill._skillFamily = SkillFamiliesModule.GetAmmoSkillFamily(); HooksModule.AddReturnoverride(ammoSkill); //GenericSkill passiveSkill = obj.AddComponent<GenericSkill>(); //passiveSkill._skillFamily = SkillFamiliesModule.GetPassiveSkillFamily(); //HooksModule.AddReturnoverride( passiveSkill ); GenericSkill primarySkill = obj.AddComponent <GenericSkill>(); primarySkill._skillFamily = SkillFamiliesModule.GetPrimarySkillFamily(); GenericSkill secondarySkill = obj.AddComponent <GenericSkill>(); secondarySkill._skillFamily = SkillFamiliesModule.GetSecondarySkillFamily(); GenericSkill utilitySkill = obj.AddComponent <GenericSkill>(); utilitySkill._skillFamily = SkillFamiliesModule.GetUtilitySkillFamily(); GenericSkill specialSkill = obj.AddComponent <GenericSkill>(); specialSkill._skillFamily = SkillFamiliesModule.GetSpecialSkillFamily(); SkillLocator skillLocator = obj.AddOrGetComponent <SkillLocator>(); skillLocator.primary = primarySkill; skillLocator.secondary = secondarySkill; skillLocator.utility = utilitySkill; skillLocator.special = specialSkill; skillLocator.passiveSkill = new SkillLocator.PassiveSkill { enabled = false, icon = null, skillDescriptionToken = null, skillNameToken = null, }; TeamComponent team = obj.AddOrGetComponent <TeamComponent>(); team.hideAllyCardDisplay = false; team.teamIndex = TeamIndex.None; HealthComponent health = obj.AddOrGetComponent <HealthComponent>(); health.health = 100; health.shield = 0; health.barrier = 0; health.magnetiCharge = 0; health.body = null; health.dontShowHealthbar = false; health.globalDeathEventChanceCoefficient = 1f; Interactor interactor = obj.AddOrGetComponent <Interactor>(); interactor.maxInteractionDistance = 3f; InteractionDriver interaction = obj.AddOrGetComponent <InteractionDriver>(); interaction.highlightInteractor = true; CharacterDeathBehavior death = obj.AddOrGetComponent <CharacterDeathBehavior>(); death.deathStateMachine = bodyMachine; death.deathState = SkillsCore.StateType <EntityStates.Commando.DeathState>(); death.idleStateMachine = nonBodyStateMachines; CharacterNetworkTransform netTrans = obj.AddOrGetComponent <CharacterNetworkTransform>(); netTrans.positionTransmitInterval = 0.05f; netTrans.lastPositionTransmitTime = Single.MinValue; netTrans.interpolationFactor = 3f; netTrans.debugDuplicatePositions = false; netTrans.debugSnapshotReceived = false; NetworkStateMachine netStates = obj.AddOrGetComponent <NetworkStateMachine>(); netStates.stateMachines = allStateMachines; //stateMachines.Set( netStates, allStateMachines ); CharacterEmoteDefinitions emotes = obj.AddOrGetComponent <CharacterEmoteDefinitions>(); emotes.emoteDefinitions = null; EquipmentSlot equip = obj.AddOrGetComponent <EquipmentSlot>(); SfxLocator sfx = obj.AddOrGetComponent <SfxLocator>(); sfx.deathSound = "Play_ui_player_death"; sfx.barkSound = ""; sfx.openSound = ""; sfx.landingSound = "Play_char_land"; sfx.fallDamageSound = "Play_char_land_fall_damage"; sfx.aliveLoopStart = ""; sfx.aliveLoopStop = ""; Rigidbody rb = obj.AddOrGetComponent <Rigidbody>(); rb.mass = 100f; rb.drag = 0f; rb.angularDrag = 0f; rb.useGravity = false; rb.isKinematic = true; rb.interpolation = RigidbodyInterpolation.None; rb.collisionDetectionMode = CollisionDetectionMode.Discrete; rb.constraints = RigidbodyConstraints.None; CapsuleCollider col = obj.AddOrGetComponent <CapsuleCollider>(); col.isTrigger = false; col.material = null; col.center = new Vector3(0f, 0f, 0f); col.radius = 0.5f; col.height = 1.82f; col.direction = 1; KinematicCharacterMotor kinCharMot = obj.AddOrGetComponent <KinematicCharacterMotor>(); kinCharMot.CharacterController = motor; kinCharMot.Capsule = col; kinCharMot.Rigidbody = rb; kinCharMot.CapsuleRadius = 0.5f; kinCharMot.CapsuleHeight = 1.82f; kinCharMot.CapsuleYOffset = 0f; kinCharMot.CapsulePhysicsMaterial = null; kinCharMot.DetectDiscreteCollisions = false; kinCharMot.GroundDetectionExtraDistance = 0f; kinCharMot.MaxStepHeight = 0.2f; kinCharMot.MinRequiredStepDepth = 0.1f; kinCharMot.MaxStableSlopeAngle = 55f; kinCharMot.MaxStableDistanceFromLedge = 0.5f; kinCharMot.PreventSnappingOnLedges = false; kinCharMot.MaxStableDenivelationAngle = 55f; kinCharMot.RigidbodyInteractionType = RigidbodyInteractionType.None; kinCharMot.PreserveAttachedRigidbodyMomentum = true; kinCharMot.HasPlanarConstraint = false; kinCharMot.PlanarConstraintAxis = Vector3.up; kinCharMot.StepHandling = StepHandlingMethod.None; kinCharMot.LedgeHandling = true; kinCharMot.InteractiveRigidbodyHandling = true; kinCharMot.SafeMovement = false; SetStateOnHurt hurt = obj.AddOrGetComponent <SetStateOnHurt>(); hurt.hitThreshold = 5f; hurt.targetStateMachine = bodyMachine; hurt.idleStateMachine = nonBodyStateMachines; hurt.hurtState = SkillsCore.StateType <Idle>(); hurt.canBeHitStunned = false; hurt.canBeStunned = false; hurt.canBeFrozen = true; CharacterModel charModel = model.AddOrGetComponent <CharacterModel>(); charModel.body = body; charModel.itemDisplayRuleSet = ItemDisplayModule.GetSniperItemDisplay(model.AddOrGetComponent <ChildLocator>()); HurtBoxGroup hurtBoxGroup = model.AddOrGetComponent <HurtBoxGroup>(); HurtBox tempHb = model.GetComponentInChildren <HurtBox>(); tempHb.gameObject.layer = LayerIndex.entityPrecise.intVal; tempHb.healthComponent = health; tempHb.isBullseye = true; tempHb.damageModifier = HurtBox.DamageModifier.Normal; tempHb.hurtBoxGroup = hurtBoxGroup; tempHb.indexInGroup = 0; hurtBoxGroup.hurtBoxes = new[] { tempHb, }; hurtBoxGroup.mainHurtBox = tempHb; hurtBoxGroup.bullseyeCount = 1; FootstepHandler footsteps = model.AddComponent <FootstepHandler>(); footsteps.baseFootstepString = "Play_player_footstep"; footsteps.sprintFootstepOverrideString = ""; footsteps.enableFootstepDust = true; footsteps.footstepDustPrefab = UnityEngine.Resources.Load <GameObject>("Prefabs/GenericFootstepDust"); RagdollController ragdoll = model.AddOrGetComponent <RagdollController>(); ragdoll.bones = null; // FUTURE: Setup sniper ragdoll controller ragdoll.componentsToDisableOnRagdoll = null; AimAnimator aimAnimator = model.AddOrGetComponent <AimAnimator>(); aimAnimator.inputBank = input; aimAnimator.directionComponent = direction; aimAnimator.pitchRangeMax = 55f; aimAnimator.pitchRangeMin = -50f; aimAnimator.yawRangeMin = -40f; aimAnimator.yawRangeMax = 45f; aimAnimator.pitchGiveupRange = 30f; aimAnimator.yawGiveupRange = 10f; aimAnimator.giveupDuration = 8f; ModelSkinController skinController = model.AddOrGetComponent <ModelSkinController>(); SkinDef[] skinsArray = skinController.skins; for (Int32 i = 0; i < skinsArray.Length; ++i) { SkinDef skin = skinsArray[i]; skin.minionSkinReplacements = new[] { new SkinDef.MinionSkinReplacement { minionBodyPrefab = DecoyModule.GetDecoyPrefab(), minionSkin = skin }, }; } foreach (IRuntimePrefabComponent comp in obj.GetComponents <IRuntimePrefabComponent>()) { comp.InitializePrefab(); } }
/// <summary> /// Create a survivor prefab from a model. Don't register the prefab that it outputs, because the method already does that for you. /// </summary> /// <returns>The prefab created from the model.</returns> public GameObject CreatePrefab() { if (prefabName == "") { Log.LogW("Prefab name has not been set."); prefabName = "RandomAssSurvivorBody"; } GameObject prefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterBodies/CommandoBody"), prefabName, true); prefab.GetComponent <NetworkIdentity>().localPlayerAuthority = true; SetupModelBase(); SetupCamera(); SetupAim(); void SetupModelBase() { UnityEngine.Object.Destroy(prefab.transform.Find("ModelBase").gameObject); UnityEngine.Object.Destroy(prefab.transform.Find("CameraPivot").gameObject); UnityEngine.Object.Destroy(prefab.transform.Find("AimOrigin").gameObject); modelBase.transform.parent = prefab.transform; modelBase.transform.localPosition = new Vector3(0f, -0.81f, 0f); modelBase.transform.localRotation = Quaternion.identity; //modelBase.transform.localScale = Vector3.one; } void SetupCamera() { camPivot.transform.parent = prefab.transform; camPivot.transform.localPosition = new Vector3(0f, -0.81f, 0f); camPivot.transform.rotation = Quaternion.identity; camPivot.transform.localScale = Vector3.one; } void SetupAim() { aimOrigin.transform.parent = prefab.transform; aimOrigin.transform.localPosition = new Vector3(0f, 1.4f, 0f); aimOrigin.transform.rotation = Quaternion.identity; aimOrigin.transform.localScale = Vector3.one; } if (!model) { Log.LogE("Character model has not been loaded, returning null. " + prefabName + " will not function properly."); return(null); } Transform transform = model.transform; CharacterDirection dir = prefab.GetComponent <CharacterDirection>(); CharacterBody body = prefab.GetComponent <CharacterBody>(); CharacterMotor motor = prefab.GetComponent <CharacterMotor>(); CameraTargetParams camParams = prefab.GetComponent <CameraTargetParams>(); ModelLocator locator = prefab.GetComponent <ModelLocator>(); CharacterModel charModel = transform.gameObject.AddComponent <CharacterModel>(); ChildLocator childLoc = model.GetComponent <ChildLocator>(); TeamComponent teamComponent = null; if (prefab.GetComponent <TeamComponent>() != null) { teamComponent = prefab.GetComponent <TeamComponent>(); } else { teamComponent = prefab.GetComponent <TeamComponent>(); } HealthComponent health = prefab.GetComponent <HealthComponent>(); CharacterDeathBehavior deathBehavior = prefab.GetComponent <CharacterDeathBehavior>(); Rigidbody rigidbody = prefab.GetComponent <Rigidbody>(); CapsuleCollider collider = prefab.GetComponent <CapsuleCollider>(); KinematicCharacterMotor kMotor = prefab.GetComponent <KinematicCharacterMotor>(); HurtBoxGroup hurtbox = model.AddComponent <HurtBoxGroup>(); CapsuleCollider coll1 = model.GetComponentInChildren <CapsuleCollider>(); HurtBox hb = coll1.gameObject.AddComponent <HurtBox>(); FootstepHandler footstep = model.AddComponent <FootstepHandler>(); AimAnimator aimer = model.AddComponent <AimAnimator>(); SetupModelTransform(); SetupCharacterDirection(); SetupCharacterBody(); SetupCharacterMotor(); SetupCameraParams(); SetupModelLocator(); SetupModel(); SetupShaders(); SetupSkins(); SetupTeamComponent(); SetupHealthComponent(); SetupInteractors(); SetupDeathBehavior(); SetupRigidBody(); SetupCollider(); SetupKCharacterMotor(); SetupHurtbox(); SetupFootstep(); SetupAimAnimator(); SetupHitbox(); void SetupModelTransform() { transform.parent = modelBase.transform; //transform.localPosition = Vector3.zero; transform.localRotation = Quaternion.identity; } void SetupCharacterDirection() { dir.moveVector = Vector3.zero; dir.targetTransform = modelBase.transform; dir.overrideAnimatorForwardTransform = null; dir.rootMotionAccumulator = null; dir.modelAnimator = model.GetComponentInChildren <Animator>(); dir.driveFromRootRotation = false; dir.turnSpeed = 720f; } void SetupCharacterBody() { body.name = prefabName; body.bodyFlags = CharacterBody.BodyFlags.ImmuneToExecutes; body.rootMotionInMainState = false; body.mainRootSpeed = 0; body.bodyIndex = -1; body.aimOriginTransform = aimOrigin.transform; body.hullClassification = HullClassification.Human; } void SetupCharacterMotor() { //CharacterMotor motor = prefab.GetComponent<CharacterMotor>(); motor.walkSpeedPenaltyCoefficient = 1f; motor.characterDirection = dir; motor.muteWalkMotion = false; motor.mass = 100f; motor.airControl = 0.25f; motor.disableAirControlUntilCollision = false; motor.generateParametersOnAwake = true; } void SetupCameraParams() { camParams.cameraParams = Resources.Load <GameObject>("Prefabs/CharacterBodies/CommandoBody").GetComponent <CameraTargetParams>().cameraParams; camParams.cameraPivotTransform = null; camParams.aimMode = CameraTargetParams.AimType.Standard; camParams.recoil = Vector2.zero; camParams.idealLocalCameraPos = Vector3.zero; camParams.dontRaycastToPivot = false; } void SetupModelLocator() { locator.modelTransform = transform; locator.modelBaseTransform = modelBase.transform; locator.dontReleaseModelOnDeath = false; locator.autoUpdateModelTransform = true; locator.dontDetatchFromParent = false; locator.noCorpse = false; locator.normalizeToFloor = false; locator.preserveModel = false; } void SetupTeamComponent() { teamComponent.hideAllyCardDisplay = false; teamComponent.teamIndex = TeamIndex.None; } void SetupHealthComponent() { health.body = null; health.dontShowHealthbar = false; health.globalDeathEventChanceCoefficient = 1f; } void SetupInteractors() { prefab.GetComponent <Interactor>().maxInteractionDistance = 3f; prefab.GetComponent <InteractionDriver>().highlightInteractor = true; } void SetupDeathBehavior() { deathBehavior.deathStateMachine = prefab.GetComponent <EntityStateMachine>(); deathBehavior.deathState = new SerializableEntityStateType(typeof(GenericCharacterDeath)); } void SetupRigidBody() { rigidbody.mass = 100f; rigidbody.drag = 0f; rigidbody.angularDrag = 0f; rigidbody.useGravity = false; rigidbody.isKinematic = true; rigidbody.interpolation = RigidbodyInterpolation.None; rigidbody.collisionDetectionMode = CollisionDetectionMode.Discrete; rigidbody.constraints = RigidbodyConstraints.None; } void SetupCollider() { collider.isTrigger = false; collider.material = null; collider.center = Vector3.zero; collider.direction = 1; } void SetupModel() { charModel.body = body; List <CharacterModel.RendererInfo> infos = new List <CharacterModel.RendererInfo>(); infos.Add(new CharacterModel.RendererInfo { defaultMaterial = model.GetComponentInChildren <SkinnedMeshRenderer>().material, renderer = model.GetComponentInChildren <SkinnedMeshRenderer>(), defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off, ignoreOverlays = false }); SkinnedMeshRenderer[] skinnedMeshRenderer = model.GetComponentsInChildren <SkinnedMeshRenderer>(); for (int i = 0; i < skinnedMeshRenderer.Length; i++) { infos.Add(new CharacterModel.RendererInfo { defaultMaterial = skinnedMeshRenderer[i].material, renderer = skinnedMeshRenderer[i], defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On, ignoreOverlays = false }); } charModel.baseRendererInfos = infos.ToArray(); charModel.autoPopulateLightInfos = true; charModel.invisibilityCount = 0; charModel.temporaryOverlays = new List <TemporaryOverlay>(); } void SetupKCharacterMotor() { kMotor.CharacterController = motor; kMotor.Capsule = collider; kMotor.Rigidbody = rigidbody; kMotor.DetectDiscreteCollisions = false; kMotor.GroundDetectionExtraDistance = 0f; kMotor.MaxStepHeight = 0.2f; kMotor.MinRequiredStepDepth = 0.1f; kMotor.MaxStableSlopeAngle = 55f; kMotor.MaxStableDistanceFromLedge = 0.5f; kMotor.PreventSnappingOnLedges = false; kMotor.MaxStableDenivelationAngle = 55f; kMotor.RigidbodyInteractionType = RigidbodyInteractionType.None; kMotor.PreserveAttachedRigidbodyMomentum = true; kMotor.HasPlanarConstraint = false; kMotor.PlanarConstraintAxis = Vector3.up; kMotor.StepHandling = StepHandlingMethod.None; kMotor.LedgeHandling = true; kMotor.InteractiveRigidbodyHandling = true; kMotor.SafeMovement = false; } void SetupHurtbox() { hb.gameObject.layer = LayerIndex.entityPrecise.intVal; hb.healthComponent = health; hb.isBullseye = true; hb.damageModifier = HurtBox.DamageModifier.Normal; hb.hurtBoxGroup = hurtbox; hb.indexInGroup = 0; hurtbox.hurtBoxes = new HurtBox[] { hb }; hurtbox.mainHurtBox = hb; hurtbox.bullseyeCount = 1; } void SetupFootstep() { footstep.baseFootstepString = "Play_player_footstep"; footstep.sprintFootstepOverrideString = ""; footstep.enableFootstepDust = true; footstep.footstepDustPrefab = Resources.Load <GameObject>("Prefabs/GenericFootstepDust"); } //RagdollController ragdoll = model.GetComponent<RagdollController>(); //TODO //ragdoll.bones = null; //ragdoll.componentsToDisableOnRagdoll = null; void SetupAimAnimator() { aimer.inputBank = prefab.GetComponent <InputBankTest>(); aimer.directionComponent = dir; aimer.pitchRangeMax = 60f; aimer.pitchRangeMin = -60f; aimer.yawRangeMax = 90f; aimer.yawRangeMin = -90f; aimer.pitchGiveupRange = 30f; aimer.yawGiveupRange = 10f; aimer.giveupDuration = 3f; } void SetupHitbox() { foreach (Transform child in transform) { if (child.name.Contains("Hitbox")) { var hitBoxGroup = model.AddComponent <HitBoxGroup>(); var hitBox = child.gameObject.AddComponent <HitBox>(); hitBoxGroup.groupName = child.name; hitBoxGroup.hitBoxes = new HitBox[] { hitBox }; } } } void SetupShaders() { foreach (Transform child in transform) { var renderer = child.gameObject.GetComponent <Renderer>(); if (renderer) { var material = CreateMaterial(renderer.material, 10, Color.white, 0); renderer.material = material; } } } void SetupSkins() { //LanguageAPI.Add("NEMMANDO_DEFAULT_SKIN_NAME", "Default"); var obj = transform.gameObject; var mdl = obj.GetComponent <CharacterModel>(); var skinController = obj.AddComponent <ModelSkinController>(); LoadoutAPI.SkinDefInfo skinDefInfo = new LoadoutAPI.SkinDefInfo { Name = "DEFAULT_SKIN", NameToken = "DEFAULT_SKIN", Icon = defaultSkinIcon, RootObject = obj, RendererInfos = mdl.baseRendererInfos, GameObjectActivations = Array.Empty <SkinDef.GameObjectActivation>(), MeshReplacements = Array.Empty <SkinDef.MeshReplacement>(), BaseSkins = Array.Empty <SkinDef>(), MinionSkinReplacements = Array.Empty <SkinDef.MinionSkinReplacement>(), ProjectileGhostReplacements = Array.Empty <SkinDef.ProjectileGhostReplacement>(), UnlockableName = "" }; CharacterModel.RendererInfo[] rendererInfos = skinDefInfo.RendererInfos; CharacterModel.RendererInfo[] array = new CharacterModel.RendererInfo[rendererInfos.Length]; rendererInfos.CopyTo(array, 0); array[0].defaultMaterial = masterySkinDelegate.Invoke(); LoadoutAPI.SkinDefInfo masteryInfo = new LoadoutAPI.SkinDefInfo { Name = "DEFAULT_SKIN", NameToken = "DEFAULT_SKIN", Icon = defaultSkinIcon, RootObject = obj, RendererInfos = array, GameObjectActivations = Array.Empty <SkinDef.GameObjectActivation>(), MeshReplacements = Array.Empty <SkinDef.MeshReplacement>(), BaseSkins = Array.Empty <SkinDef>(), MinionSkinReplacements = Array.Empty <SkinDef.MinionSkinReplacement>(), ProjectileGhostReplacements = Array.Empty <SkinDef.ProjectileGhostReplacement>(), UnlockableName = masteryAchievementUnlockable }; SkinDef skinDefault = LoadoutAPI.CreateNewSkinDef(skinDefInfo); SkinDef mastery = LoadoutAPI.CreateNewSkinDef(masteryInfo); SkinDef[] skinDefs = new SkinDef[2] { skinDefault, mastery }; skinController.skins = skinDefs; } API.RegisterNewBody(prefab); return(prefab); }