Exemple #1
0
        protected virtual void SetupCameraTargetParams(GameObject prefab)
        {
            CameraTargetParams cameraTargetParams = prefab.GetComponent <CameraTargetParams>();

            cameraTargetParams.cameraPivotTransform = prefab.transform.Find("ModelBase").Find("CameraPivot");
            cameraTargetParams.RequestAimType(CameraTargetParams.AimType.Standard);
            cameraTargetParams.recoil             = Vector2.zero;
            cameraTargetParams.dontRaycastToPivot = false;
        }
Exemple #2
0
        private static void SetupCameraTargetParams(GameObject prefab)
        {
            CameraTargetParams cameraTargetParams = prefab.GetComponent <CameraTargetParams>();

            cameraTargetParams.cameraParams         = Resources.Load <GameObject>("Prefabs/CharacterBodies/MercBody").GetComponent <CameraTargetParams>().cameraParams;
            cameraTargetParams.cameraPivotTransform = prefab.transform.Find("ModelBase").Find("CameraPivot");
            cameraTargetParams.aimMode             = CameraTargetParams.AimType.Standard;
            cameraTargetParams.recoil              = Vector2.zero;
            cameraTargetParams.idealLocalCameraPos = Vector3.zero;
            cameraTargetParams.dontRaycastToPivot  = false;
        }
Exemple #3
0
        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;
        }
Exemple #4
0
        public override void FixedUpdate()
        {
            base.FixedUpdate();

            bool flag = false;

            if (base.characterMotor)
            {
                if (!base.characterMotor.isGrounded)
                {
                    flag = true;
                }
                if (base.characterMotor.velocity != Vector3.zero)
                {
                    flag = true;
                }
            }

            if (base.inputBank)
            {
                if (base.inputBank.skill1.down)
                {
                    flag = true;
                }
                if (base.inputBank.skill2.down)
                {
                    flag = true;
                }
                if (base.inputBank.skill3.down)
                {
                    flag = true;
                }
                if (base.inputBank.skill4.down)
                {
                    flag = true;
                }
                if (base.inputBank.jump.down)
                {
                    flag = true;
                }

                if (base.inputBank.moveVector != Vector3.zero)
                {
                    flag = true;
                }
            }

            //emote cancels
            if (base.isAuthority && base.characterMotor.isGrounded && !this.localUser.isUIFocused)
            {
                if (Input.GetKeyDown(Modules.Config.displayKeybind.Value))
                {
                    this.outer.SetInterruptState(EntityStateCatalog.InstantiateState(new SerializableEntityStateType(typeof(Display))), InterruptPriority.Any);
                    return;
                }
                else if (Input.GetKeyDown(Modules.Config.poseKeybind.Value))
                {
                    this.outer.SetInterruptState(EntityStateCatalog.InstantiateState(new SerializableEntityStateType(typeof(Pose))), InterruptPriority.Any);
                    return;
                }
            }

            if (this.duration > 0 && base.fixedAge >= this.duration)
            {
                flag = true;
            }

            CameraTargetParams ctp = base.cameraTargetParams;
            float   denom          = (1 + Time.fixedTime - this.initialTime);
            float   smoothFactor   = 8 / Mathf.Pow(denom, 2);
            Vector3 smoothVector   = new Vector3(-3 / 20, 1 / 16, -1);

            ctp.idealLocalCameraPos = new Vector3(0f, -1.4f, -6f) + smoothFactor * smoothVector;

            if (this.animator)
            {
                this.animator.SetBool("inCombat", true);
            }

            if (flag)
            {
                this.outer.SetNextStateToMain();
            }
        }
        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;
        }
Exemple #6
0
        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();
            }
        }
Exemple #7
0
        public 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"), "RocketeerBody", true, "C:\\Users\\Tinde\\Desktop\\Lurgypai\\ROR2\\mods\\Projects\\files\\ExampleSurvivor\\ExampleSurvivor\\ExampleSurvivor\\ExampleSurvivor\\Rocketeer.cs", "CreatePrefab", 151);

            characterPrefab.GetComponent <NetworkIdentity>().localPlayerAuthority = true;

            // set up the character body here
            CharacterBody bodyComponent = characterPrefab.GetComponent <CharacterBody>();
            GameObject    gameObject4   = new GameObject("AimOrigin");

            bodyComponent.name                     = "RocketeerBody";
            bodyComponent.baseNameToken            = "ROCKETEER_NAME";
            bodyComponent.subtitleNameToken        = "ROCKETEER_SUBTITLE";
            bodyComponent.bodyFlags                = CharacterBody.BodyFlags.ImmuneToExecutes;
            bodyComponent.rootMotionInMainState    = false;
            bodyComponent.mainRootSpeed            = 0f;
            bodyComponent.baseMaxHealth            = 85f;
            bodyComponent.levelMaxHealth           = 20f;
            bodyComponent.baseRegen                = 1.0f;
            bodyComponent.levelRegen               = 0.2f;
            bodyComponent.baseMaxShield            = 0f;
            bodyComponent.levelMaxShield           = 0f;
            bodyComponent.baseMoveSpeed            = 7f;
            bodyComponent.levelMoveSpeed           = 0f;
            bodyComponent.baseAcceleration         = 80f;
            bodyComponent.baseJumpPower            = 15f;
            bodyComponent.levelJumpPower           = 0f;
            bodyComponent.baseDamage               = 13f;
            bodyComponent.levelDamage              = 2.7f;
            bodyComponent.baseAttackSpeed          = 1f;
            bodyComponent.levelAttackSpeed         = 0f;
            bodyComponent.baseCrit                 = 1f;
            bodyComponent.levelCrit                = 0f;
            bodyComponent.baseArmor                = 20f;
            bodyComponent.levelArmor               = 0f;
            bodyComponent.baseJumpCount            = 1;
            bodyComponent.sprintingSpeedMultiplier = 1.45f;
            bodyComponent.wasLucky                 = false;
            bodyComponent.hideCrosshair            = false;
            bodyComponent.crosshairPrefab          = Resources.Load <GameObject>("Prefabs/Crosshair/StandardCrosshair");
            bodyComponent.aimOriginTransform       = gameObject4.transform;
            bodyComponent.hullClassification       = HullClassification.Human;
            bodyComponent.isChampion               = false;
            bodyComponent.currentVehicle           = null;
            bodyComponent.skinIndex                = 0U;
            bodyComponent.bodyColor                = characterColor;
            bodyComponent.tag = "Player";

            // the charactermotor controls the survivor's movement and stuff
            CharacterMotor characterMotor = characterPrefab.GetComponent <CharacterMotor>();

            characterMotor.walkSpeedPenaltyCoefficient = 1f;
            characterMotor.muteWalkMotion = false;
            characterMotor.mass           = 95f;
            characterMotor.airControl     = 0.7f;
            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.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;


            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            = 100f;
            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;

            characterPrefab.AddComponent <RocketeerShinyJetpackController>();
        }
Exemple #8
0
        private static GameObject CreateDecoyPrefab()
        {
            GameObject obj = PrefabsCore.CreatePrefab("SniperDecoy", true);

            TeamComponent teamComp = obj.AddOrGetComponent <TeamComponent>();

            teamComp.hideAllyCardDisplay = false;
            teamComp.teamIndex           = TeamIndex.None;


            NetworkIdentity netId = obj.AddOrGetComponent <NetworkIdentity>();


            Transform modelBase = new GameObject("ModelBase").transform;

            modelBase.parent        = obj.transform;
            modelBase.localPosition = new Vector3(0f, -0.81f, 0f);
            modelBase.localScale    = Vector3.one;
            modelBase.localRotation = Quaternion.identity;


            GameObject mdlSniper = UnityEngine.Object.Instantiate <GameObject>(ModelModule.GetModel(), modelBase);

            mdlSniper.transform.localPosition = Vector3.zero;
            mdlSniper.transform.localScale    = Vector3.one;
            mdlSniper.transform.localRotation = Quaternion.identity;



            CharacterBody body = obj.AddOrGetComponent <CharacterBody>();

            body.bodyIndex             = (BodyIndex)(-1);
            body.baseNameToken         = Properties.Tokens.SNIPER_NAME;
            body.subtitleNameToken     = Properties.Tokens.SNIPER_SUBTITLE;
            body.bodyFlags             = CharacterBody.BodyFlags.ResistantToAOE | CharacterBody.BodyFlags.ImmuneToExecutes;
            body.rootMotionInMainState = false;
            body.mainRootSpeed         = 0f;

            // CLEANUP: Abstract out base stats for decoy and sniper
            body.baseMaxHealth  = 130f;
            body.levelMaxHealth = 39f;

            body.baseRegen  = 1f;
            body.levelRegen = 0.2f;

            body.baseMaxShield  = 0f;
            body.levelMaxShield = 0f;

            body.baseMoveSpeed  = 0f;
            body.levelMoveSpeed = 0f;

            body.baseAcceleration = 0f;

            body.baseJumpPower  = 0f;
            body.levelJumpPower = 0f;

            body.baseDamage  = 12f;
            body.levelDamage = 2.4f;

            body.baseAttackSpeed  = 1f;
            body.levelAttackSpeed = 0f;

            body.baseCrit  = 0f;
            body.levelCrit = 0f;

            body.baseArmor  = 50f;
            body.levelArmor = 10f;

            body.baseJumpCount = 1;

            body.sprintingSpeedMultiplier = 0f;

            //body.killCount = 0;
            body.wasLucky                  = false;
            body.spreadBloomDecayTime      = 0.45f;
            body.spreadBloomCurve          = new AnimationCurve();
            body.crosshairPrefab           = null;
            body.hideCrosshair             = false;
            body.aimOriginTransform        = body.transform;
            body.hullClassification        = HullClassification.Human;
            body.portraitIcon              = UIModule.GetPortraitIcon();
            body.isChampion                = false;
            body.currentVehicle            = null;
            body.preferredPodPrefab        = null;
            body.preferredInitialStateType = SkillsCore.StateType <GenericCharacterMain>();
            body.skinIndex                 = 0u;



            CharacterModel model = mdlSniper.AddOrGetComponent <CharacterModel>();

            model.body = body;
            model.itemDisplayRuleSet = ItemDisplayModule.GetSniperItemDisplay(model.AddOrGetComponent <ChildLocator>());



            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;



            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;


            InputBankTest inputs = obj.AddOrGetComponent <InputBankTest>();

            inputs.moveVector = Vector3.zero;


            CameraTargetParams cameraTargetParams = obj.AddOrGetComponent <CameraTargetParams>();

            cameraTargetParams.cameraParams         = MiscModule.GetCharCameraParams();
            cameraTargetParams.cameraPivotTransform = null;
            cameraTargetParams.aimMode             = CameraTargetParams.AimType.Standard;
            cameraTargetParams.recoil              = Vector2.zero;
            cameraTargetParams.idealLocalCameraPos = Vector3.zero;
            cameraTargetParams.dontRaycastToPivot  = false;



            ModelLocator modelLocator = obj.AddOrGetComponent <ModelLocator>();

            modelLocator.modelTransform           = mdlSniper.transform;
            modelLocator.modelBaseTransform       = modelBase;
            modelLocator.dontReleaseModelOnDeath  = false;
            modelLocator.autoUpdateModelTransform = true;
            modelLocator.dontDetatchFromParent    = false;
            modelLocator.noCorpse         = true;
            modelLocator.normalizeToFloor = false;
            modelLocator.preserveModel    = false;


            EntityStateMachine esm = obj.AddOrGetComponent <EntityStateMachine>();

            esm.customName       = "Body";
            esm.initialStateType = SkillsCore.StateType <BeingADecoy>();
            esm.mainStateType    = SkillsCore.StateType <BeingADecoy>();


            SkillLocator skillLocator = obj.AddOrGetComponent <SkillLocator>();

            skillLocator.primary   = null;
            skillLocator.secondary = null;
            skillLocator.utility   = null;
            skillLocator.special   = null;


            CharacterDeathBehavior deathBehaviour = obj.AddOrGetComponent <CharacterDeathBehavior>();

            deathBehaviour.deathStateMachine = esm;
            deathBehaviour.deathState        = SkillsCore.StateType <DecoyDeathState>();
            deathBehaviour.idleStateMachine  = Array.Empty <EntityStateMachine>();


            CharacterNetworkTransform netTrans = obj.AddOrGetComponent <CharacterNetworkTransform>();

            netTrans.positionTransmitInterval = 0.1f;
            netTrans.lastPositionTransmitTime = Single.NegativeInfinity;
            netTrans.interpolationFactor      = 2f;
            netTrans.debugDuplicatePositions  = false;
            netTrans.debugSnapshotReceived    = false;


            NetworkStateMachine netStates = obj.AddOrGetComponent <NetworkStateMachine>();

            //netStates._SetStateMachines( esm );
            netStates.stateMachines = new[] { esm };


            Interactor interactor = obj.AddOrGetComponent <Interactor>();

            interactor.maxInteractionDistance = 1f;


            InteractionDriver interactionDriver = obj.AddOrGetComponent <InteractionDriver>();

            interactionDriver.highlightInteractor = false;


            CapsuleCollider cap = obj.AddOrGetComponent <CapsuleCollider>();

            cap.isTrigger = false;
            cap.material  = null;
            cap.center    = Vector3.zero;
            cap.radius    = 0.5f;
            cap.height    = 1.82f;
            cap.direction = 1;


            SetStateOnHurt hurtState = obj.AddOrGetComponent <SetStateOnHurt>();

            hurtState.hitThreshold       = 5f;
            hurtState.targetStateMachine = esm;
            hurtState.idleStateMachine   = Array.Empty <EntityStateMachine>();
            hurtState.hurtState          = SkillsCore.StateType <Idle>();
            hurtState.canBeHitStunned    = false;
            hurtState.canBeFrozen        = true;
            hurtState.canBeStunned       = false;


            SfxLocator sfx = obj.AddOrGetComponent <SfxLocator>();
            // FUTURE: Death sounds for decoy


            Rigidbody rb = obj.AddOrGetComponent <Rigidbody>();

            rb.mass                   = 1000f;
            rb.drag                   = 0f;
            rb.angularDrag            = 0f;
            rb.useGravity             = false;
            rb.isKinematic            = true;
            rb.interpolation          = RigidbodyInterpolation.None;
            rb.collisionDetectionMode = CollisionDetectionMode.Discrete;


            CharacterMotor charMot = obj.AddOrGetComponent <CharacterMotor>();

            charMot.walkSpeedPenaltyCoefficient = 1f;
            CharacterDirection charDir = charMot.characterDirection = obj.AddOrGetComponent <CharacterDirection>();

            charMot.muteWalkMotion = false;
            charMot.mass           = 1000f;
            charMot.airControl     = 0.25f;
            charMot.disableAirControlUntilCollision = false;
            charMot.generateParametersOnAwake       = true;
            charMot.useGravity = true;
            charMot.isFlying   = false;


            charDir.moveVector      = Vector3.zero;
            charDir.targetTransform = modelBase;
            charDir.overrideAnimatorForwardTransform = null;
            charDir.rootMotionAccumulator            = null;
            charDir.modelAnimator         = null;
            charDir.driveFromRootRotation = false;
            charDir.driveFromRootRotation = false;
            charDir.turnSpeed             = 180f;


            KinematicCharacterController.KinematicCharacterMotor kinCharMot = obj.AddOrGetComponent <KinematicCharacterController.KinematicCharacterMotor>();
            kinCharMot.CharacterController               = charMot;
            kinCharMot.Capsule                           = cap;
            kinCharMot.Rigidbody                         = rb;
            kinCharMot.CapsuleRadius                     = 0.5f;
            kinCharMot.CapsuleHeight                     = 1.8f;
            kinCharMot.CapsuleYOffset                    = 0f;
            kinCharMot.DetectDiscreteCollisions          = false;
            kinCharMot.GroundDetectionExtraDistance      = 0f;
            kinCharMot.MaxStepHeight                     = 0.5f;
            kinCharMot.MinRequiredStepDepth              = 0.1f;
            kinCharMot.MaxStableSlopeAngle               = 55f;
            kinCharMot.MaxStableDistanceFromLedge        = 0.5f;
            kinCharMot.PreventSnappingOnLedges           = false;
            kinCharMot.MaxStableDenivelationAngle        = 55f;
            kinCharMot.RigidbodyInteractionType          = KinematicCharacterController.RigidbodyInteractionType.None;
            kinCharMot.PreserveAttachedRigidbodyMomentum = true;
            kinCharMot.HasPlanarConstraint               = false;
            kinCharMot.PlanarConstraintAxis              = Vector3.up;
            kinCharMot.StepHandling                      = KinematicCharacterController.StepHandlingMethod.Standard;
            kinCharMot.LedgeHandling                     = true;
            kinCharMot.InteractiveRigidbodyHandling      = true;
            kinCharMot.SafeMovement                      = false;


            _ = obj.AddComponent <DecoyDeployableSync>();


            obj.layer = LayerIndex.fakeActor.intVal;


            foreach (IRuntimePrefabComponent comp in obj.GetComponents <IRuntimePrefabComponent>())
            {
                comp.InitializePrefab();
            }


            BodiesCore.Add(obj);

            return(obj);
        }
    /// <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);
    }
Exemple #10
0
        public override void FixedUpdate()
        {
            base.FixedUpdate();

            bool flag = false;

            if (base.characterMotor)
            {
                if (!base.characterMotor.isGrounded)
                {
                    flag = true;
                }
                if (base.characterMotor.velocity != Vector3.zero)
                {
                    flag = true;
                }
            }

            if (base.inputBank)
            {
                if (base.inputBank.skill1.down)
                {
                    flag = true;
                }
                if (base.inputBank.skill2.down)
                {
                    flag = true;
                }
                if (base.inputBank.skill3.down)
                {
                    flag = true;
                }
                if (base.inputBank.skill4.down)
                {
                    flag = true;
                }
                if (base.inputBank.jump.down)
                {
                    flag = true;
                }

                if (base.inputBank.moveVector != Vector3.zero)
                {
                    flag = true;
                }
            }

            //emote cancels
            if (base.isAuthority && base.characterMotor.isGrounded)
            {
                if (!this.localUser.isUIFocused)
                {
                    if (Input.GetKeyDown(DiggerPlugin.DiggerPlugin.restKeybind.Value))
                    {
                        this.outer.SetInterruptState(new Rest(), InterruptPriority.Any);
                        return;
                    }
                    else if (Input.GetKeyDown(DiggerPlugin.DiggerPlugin.tauntKeybind.Value))
                    {
                        this.outer.SetInterruptState(new Taunt(), InterruptPriority.Any);
                        return;
                    }
                    else if (Input.GetKeyDown(DiggerPlugin.DiggerPlugin.jokeKeybind.Value))
                    {
                        this.outer.SetInterruptState(new Joke(), InterruptPriority.Any);
                        return;
                    }
                }
            }

            if (this.duration > 0 && base.fixedAge >= this.duration)
            {
                flag = true;
            }

            CameraTargetParams ctp = base.cameraTargetParams;
            float   denom          = (1 + Time.fixedTime - this.initialTime);
            float   smoothFactor   = 8 / Mathf.Pow(denom, 2);
            Vector3 smoothVector   = new Vector3(-3 / 20, 1 / 16, -1);

            ctp.idealLocalCameraPos = new Vector3(0f, -1.4f, -6f) + smoothFactor * smoothVector;

            if (this.explosive && base.fixedAge >= this.duration && base.isAuthority)
            {
                this.Explode();
            }

            if (flag)
            {
                this.outer.SetNextStateToMain();
            }
        }