示例#1
0
        internal void findTarget()
        {
            float maxDistance = 200.0f;
            float maxAngle    = 90;

            if (base.characterBody)
            {
                float          num            = 0;
                Ray            ray            = CameraRigController.ModifyAimRayIfApplicable(base.GetAimRay(), base.gameObject, out num);
                BullseyeSearch bullseyeSearch = new BullseyeSearch();
                bullseyeSearch.searchOrigin      = ray.origin;
                bullseyeSearch.searchDirection   = ray.direction;
                bullseyeSearch.maxDistanceFilter = maxDistance + num;
                bullseyeSearch.maxAngleFilter    = maxAngle;
                bullseyeSearch.teamMaskFilter    = TeamMask.allButNeutral;
                bullseyeSearch.teamMaskFilter.RemoveTeam(TeamComponent.GetObjectTeam(base.gameObject));
                bullseyeSearch.sortMode = BullseyeSearch.SortMode.Angle;
                bullseyeSearch.RefreshCandidates();
                this.targetHurtbox = bullseyeSearch.GetResults().FirstOrDefault <HurtBox>();
            }
            if (this.targetHurtbox)
            {
                if (!this.trackingIndicator)
                {
                    this.trackingIndicator = UnityEngine.Object.Instantiate <GameObject>(ArrowRain.areaIndicatorPrefab);
                    this.trackingIndicator.transform.localScale = new Vector3(aimMaxSize, aimMaxSize, aimMaxSize);
                }
                this.trackingIndicator.transform.position = this.targetHurtbox.transform.position;
            }
            else if (this.trackingIndicator)
            {
                EntityState.Destroy(this.trackingIndicator.gameObject);
                this.trackingIndicator = null;
            }
        }
 // Token: 0x06003109 RID: 12553 RVA: 0x000D2E84 File Offset: 0x000D1084
 public override void FixedUpdate()
 {
     base.FixedUpdate();
     if (base.isAuthority && base.fixedAge >= EngiSelfShield.transferDelay && base.skillLocator.utility.IsReady())
     {
         if (base.characterBody)
         {
             float num = 0f;
             Ray   ray = CameraRigController.ModifyAimRayIfApplicable(base.GetAimRay(), base.gameObject, out num);
             this.friendLocator.searchOrigin       = ray.origin;
             this.friendLocator.searchDirection    = ray.direction;
             this.friendLocator.maxDistanceFilter += num;
             this.friendLocator.RefreshCandidates();
             this.friendLocator.FilterOutGameObject(base.gameObject);
             this.transferTarget = this.friendLocator.GetResults().FirstOrDefault <HurtBox>();
         }
         HealthComponent healthComponent = this.transferTarget ? this.transferTarget.healthComponent : null;
         if (healthComponent)
         {
             this.indicator.targetTransform = Util.GetCoreTransform(healthComponent.gameObject);
             if (base.inputBank && base.inputBank.skill3.justPressed)
             {
                 EngiOtherShield engiOtherShield = new EngiOtherShield();
                 engiOtherShield.target = healthComponent.gameObject.GetComponent <CharacterBody>();
                 this.outer.SetNextState(engiOtherShield);
                 return;
             }
         }
         else
         {
             this.indicator.targetTransform = null;
         }
         this.indicator.active = this.indicator.targetTransform;
     }
 }
            private void FindTarget()
            {
                this.targetFinder.teamMaskFilter = TeamMask.allButNeutral;
                this.targetFinder.teamMaskFilter.RemoveTeam(this.teamIndex);
                this.targetFinder.sortMode    = BullseyeSearch.SortMode.Distance;
                this.targetFinder.filterByLoS = true;
                Ray ray = CameraRigController.ModifyAimRayIfApplicable(characterMaster.GetBody().inputBank.GetAimRay(), base.gameObject, out float num);

                this.targetFinder.searchOrigin    = ray.origin;
                this.targetFinder.searchDirection = ray.direction;
                //this.targetFinder.maxAngleFilter = 10f;
                this.targetFinder.viewer         = characterMaster.GetBody();
                this.targetFinder.teamMaskFilter = TeamMask.GetUnprotectedTeams(teamIndex);
            }
示例#4
0
            public void ConfigureTargetFinderBase(EquipmentSlot self)
            {
                if (TargetFinder == null)
                {
                    TargetFinder = new BullseyeSearch();
                }
                TargetFinder.teamMaskFilter = TeamMask.allButNeutral;
                TargetFinder.teamMaskFilter.RemoveTeam(self.characterBody.teamComponent.teamIndex);
                TargetFinder.sortMode    = BullseyeSearch.SortMode.Angle;
                TargetFinder.filterByLoS = true;
                float num;
                Ray   ray = CameraRigController.ModifyAimRayIfApplicable(self.GetAimRay(), self.gameObject, out num);

                TargetFinder.searchOrigin    = ray.origin;
                TargetFinder.searchDirection = ray.direction;
                TargetFinder.maxAngleFilter  = 10f;
                TargetFinder.viewer          = self.characterBody;
            }
 private void UpdateAreaIndicator()         //check
 {
     this.goodPlacement = false;
     this.areaIndicatorInstance.SetActive(true);
     if (this.areaIndicatorInstance)
     {
         float num    = GetMaxDistance();
         Ray   aimRay = base.GetAimRay();
         if (Physics.Raycast(CameraRigController.ModifyAimRayIfApplicable(aimRay, base.gameObject, out float num2), out RaycastHit raycastHit, num + num2, LayerIndex.world.mask))
         {
             this.areaIndicatorInstance.transform.position = raycastHit.point;
             this.areaIndicatorInstance.transform.up       = raycastHit.normal;
             this.areaIndicatorInstance.transform.forward  = -aimRay.direction;
             this.goodPlacement = (Vector3.Angle(Vector3.up, raycastHit.normal) < maxSlopeAngle);
         }
         base.characterBody.crosshairPrefab = (this.goodPlacement ? goodCrosshairPrefab : badCrosshairPrefab);
     }
     this.areaIndicatorInstance.SetActive(this.goodPlacement);
 }
 // Token: 0x06002B5A RID: 11098 RVA: 0x000B6A6C File Offset: 0x000B4C6C
 private void UpdateAreaIndicator()
 {
     this.goodPlacement = false;
     this.areaIndicatorInstance.SetActive(true);
     if (this.areaIndicatorInstance)
     {
         float      num  = CreatePounder.maxDistance;
         float      num2 = 0f;
         RaycastHit raycastHit;
         if (Physics.Raycast(CameraRigController.ModifyAimRayIfApplicable(base.GetAimRay(), base.gameObject, out num2), out raycastHit, num + num2, LayerIndex.world.mask))
         {
             this.areaIndicatorInstance.transform.position = raycastHit.point;
             this.areaIndicatorInstance.transform.up       = raycastHit.normal;
             this.goodPlacement = (Vector3.Angle(Vector3.up, raycastHit.normal) < CreatePounder.maxSlopeAngle);
         }
         base.characterBody.crosshairPrefab = (this.goodPlacement ? CreatePounder.goodCrosshairPrefab : CreatePounder.badCrosshairPrefab);
     }
     this.areaIndicatorInstance.SetActive(this.goodPlacement);
 }
示例#7
0
        private GameObject FindNearestRerollable(GameObject senderObj, Ray aim, float maxAngle, float maxDistance, bool requireLoS)
        {
            aim = CameraRigController.ModifyAimRayIfApplicable(aim, senderObj, out float camAdjust);
            var results = Physics.OverlapSphere(aim.origin, maxDistance + camAdjust, Physics.AllLayers, QueryTriggerInteraction.Collide);
            var minDot  = Mathf.Cos(Mathf.Clamp(maxAngle, 0f, 180f) * Mathf.PI / 180f);

            return(results
                   .Where(x => x && x.gameObject)
                   .Select(x => MiscUtil.GetRootWithLocators(x.gameObject))
                   .Where(x => validObjectNames.Contains(x.name))
                   .Select(x => (target: x, vdot: Vector3.Dot(aim.direction, (x.transform.position - aim.origin).normalized)))
                   .Where(x => x.vdot > minDot &&
                          (!requireLoS ||
                           !Physics.Linecast(aim.origin, x.target.transform.position, LayerIndex.world.mask)
                          ))
                   .OrderBy(x => x.vdot * Vector3.Distance(x.target.transform.position, aim.origin))
                   .Select(x => x.target.gameObject)
                   .FirstOrDefault());
        }
 // Token: 0x060006A1 RID: 1697 RVA: 0x0001F988 File Offset: 0x0001DB88
 public override void FixedUpdate()
 {
     base.FixedUpdate();
     if (base.isAuthority)
     {
         this.fireTimer -= Time.fixedDeltaTime;
         if (base.characterBody)
         {
             float          num            = 0f;
             Ray            ray            = CameraRigController.ModifyAimRayIfApplicable(base.GetAimRay(), base.gameObject, out num);
             BullseyeSearch bullseyeSearch = new BullseyeSearch();
             bullseyeSearch.searchOrigin      = ray.origin;
             bullseyeSearch.searchDirection   = ray.direction;
             bullseyeSearch.maxDistanceFilter = IdleTracking.maxTrackingDistance + num;
             bullseyeSearch.maxAngleFilter    = IdleTracking.maxTrackingAngle;
             bullseyeSearch.teamMaskFilter    = TeamMask.allButNeutral;
             bullseyeSearch.teamMaskFilter.RemoveTeam(TeamComponent.GetObjectTeam(base.gameObject));
             bullseyeSearch.sortMode = BullseyeSearch.SortMode.DistanceAndAngle;
             bullseyeSearch.RefreshCandidates();
             this.trackingTarget = bullseyeSearch.GetResults().FirstOrDefault <HurtBox>();
         }
         if (this.trackingTarget)
         {
             if (!this.trackingIndicatorTransform)
             {
                 this.trackingIndicatorTransform = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/ShieldTransferIndicator"), this.trackingTarget.transform.position, Quaternion.identity).transform;
             }
             this.trackingIndicatorTransform.position = this.trackingTarget.transform.position;
             if (base.inputBank && base.inputBank.skill1.down && this.fireTimer <= 0f)
             {
                 this.fireTimer = 1f / IdleTracking.fireFrequency / this.attackSpeedStat;
                 this.FireOrbArrow();
                 return;
             }
         }
         else if (this.trackingIndicatorTransform)
         {
             EntityState.Destroy(this.trackingIndicatorTransform.gameObject);
             this.trackingIndicatorTransform = null;
         }
     }
 }
        public bool BuildPosOnlyPingInfo(LayerMask layerMask, QueryTriggerInteraction queryInteract, float distanceBonus = 1000f)
        {
            if (!owner.body || !owner.bodyInputs)
            {
                return(false);
            }
            float      rayDist;
            var        aimRay  = CameraRigController.ModifyAimRayIfApplicable(new Ray(owner.bodyInputs.aimOrigin, owner.bodyInputs.aimDirection), owner.body.gameObject, out rayDist);
            float      maxDist = rayDist + distanceBonus;
            RaycastHit raycastHit;

            if (!Util.CharacterRaycast(owner.body.gameObject, aimRay, out raycastHit, maxDist, layerMask, queryInteract))
            {
                return(false);
            }
            lastPingInfo = new PingerController.PingInfo {
                active = true,
                origin = raycastHit.point,
                normal = raycastHit.normal,
                targetNetworkIdentity = null
            };
            return(true);
        }
示例#10
0
 private void UpdateAreaIndicator()
 {
     if (!hasFired)
     {
         float outNum = 0f;
         this.goodPlacement = false;
         this.areaIndicatorInstance.SetActive(true);
         if (this.areaIndicatorInstance)
         {
             Ray        aimray = base.GetAimRay();
             RaycastHit raycast;
             if (Physics.Raycast(CameraRigController.ModifyAimRayIfApplicable(aimray, base.gameObject, out outNum), out raycast, StaticValues.icePillarMaxRange + outNum, LayerIndex.world.mask))
             {
                 this.areaIndicatorInstance.transform.position = raycast.point;
                 this.areaIndicatorInstance.transform.up       = Vector3.up;
                 this.areaIndicatorInstance.transform.forward  = -aimray.direction;
                 this.goodPlacement = (Vector3.Angle(Vector3.up, raycast.normal) < StaticValues.icePillarMaxSlope);
             }
             base.characterBody.crosshairPrefab = (this.goodPlacement ? this.goodCrosshairInstance : this.badCrosshairInstance);
         }
         this.areaIndicatorInstance.SetActive(this.goodPlacement);
     }
 }
示例#11
0
        private GenericPickupController EquipmentSlot_FindPickupController(On.RoR2.EquipmentSlot.orig_FindPickupController orig, EquipmentSlot self, Ray aimRay, float maxAngle, float maxDistance, bool requireLoS, bool requireTransmutable)
        {
            if (self.characterBody && self.characterBody.bodyIndex == EquipmentDroneBodyIndex)
            {
                if (self.pickupSearch == null)
                {
                    self.pickupSearch = new PickupSearch();
                }
                aimRay = CameraRigController.ModifyAimRayIfApplicable(aimRay, base.gameObject, out float num);
                self.pickupSearch.searchOrigin           = aimRay.origin;
                self.pickupSearch.searchDirection        = aimRay.direction;
                self.pickupSearch.minAngleFilter         = 0f;
                self.pickupSearch.maxAngleFilter         = 360;
                self.pickupSearch.minDistanceFilter      = 0f;
                self.pickupSearch.maxDistanceFilter      = maxDistance + num;
                self.pickupSearch.filterByDistinctEntity = false;
                self.pickupSearch.filterByLoS            = requireLoS;
                self.pickupSearch.sortMode            = SortMode.DistanceAndAngle;
                self.pickupSearch.requireTransmutable = requireTransmutable;


                foreach (var pickup in self.pickupSearch.candidateInfoList)
                {
                    if (pickup.source && !pickup.source.Recycled)
                    {
                        if (allowedPickupIndices.Contains(pickup.source.pickupIndex))
                        {
                            return(pickup.source);
                        }
                    }
                }
                return(self.pickupSearch.SearchCandidatesForSingleTarget(InstanceTracker.GetInstancesList <GenericPickupController>()));
            }
            var original = orig(self, aimRay, maxAngle, maxDistance, requireLoS, requireTransmutable);

            return(original);
        }
        public override void OnLoad()
        {
            equipmentDef.name = "MysticsItems_PrinterHacker";
            ConfigManager.Balance.CreateEquipmentCooldownOption(equipmentDef, "Equipment: Wirehack Wrench", 90f);
            equipmentDef.canDrop = true;
            ConfigManager.Balance.CreateEquipmentEnigmaCompatibleOption(equipmentDef, "Equipment: Wirehack Wrench", false);
            ConfigManager.Balance.CreateEquipmentCanBeRandomlyTriggeredOption(equipmentDef, "Equipment: Wirehack Wrench", false);
            equipmentDef.pickupModelPrefab = PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/Wirehack Wrench/Model.prefab"));
            equipmentDef.pickupIconSprite  = Main.AssetBundle.LoadAsset <Sprite>("Assets/Equipment/Wirehack Wrench/Icon.png");

            HopooShaderToMaterial.Standard.Gloss(equipmentDef.pickupModelPrefab.GetComponentInChildren <Renderer>().sharedMaterial, 1f, 20f);
            itemDisplayPrefab = PrepareItemDisplayModel(PrefabAPI.InstantiateClone(equipmentDef.pickupModelPrefab, equipmentDef.pickupModelPrefab.name + "Display", false));
            equipmentDef.pickupModelPrefab.transform.Find("d4b43750924799f8").Rotate(new Vector3(0f, 0f, -30f), Space.Self);
            var modelPanelParams = equipmentDef.pickupModelPrefab.GetComponent <ModelPanelParameters>();

            modelPanelParams.minDistance = 5;
            modelPanelParams.maxDistance = 10;
            onSetupIDRS += () =>
            {
                AddDisplayRule("CommandoBody", "Stomach", new Vector3(-0.163F, 0.092F, -0.036F), new Vector3(356.022F, 118.071F, 26.4F), new Vector3(0.024F, 0.024F, 0.024F));
                AddDisplayRule("HuntressBody", "Pelvis", new Vector3(-0.088F, -0.085F, 0.059F), new Vector3(0.679F, 36.762F, 196.086F), new Vector3(0.019F, 0.019F, 0.019F));
                AddDisplayRule("Bandit2Body", "Stomach", new Vector3(0.129F, 0.025F, -0.111F), new Vector3(316.052F, 250.792F, 338.145F), new Vector3(0.038F, 0.038F, 0.038F));
                AddDisplayRule("ToolbotBody", "Hip", new Vector3(-1.202F, 0.577F, -0.876F), new Vector3(0F, 180F, 180F), new Vector3(0.349F, 0.349F, 0.349F));
                AddDisplayRule("EngiBody", "Pelvis", new Vector3(-0.178F, 0.078F, 0.157F), new Vector3(11.745F, 186.295F, 185.936F), new Vector3(0.047F, 0.047F, 0.047F));
                AddDisplayRule("MageBody", "Pelvis", new Vector3(-0.172F, -0.067F, -0.078F), new Vector3(7.421F, 5.596F, 187.29F), new Vector3(0.027F, 0.027F, 0.027F));
                AddDisplayRule("MercBody", "Chest", new Vector3(-0.115F, 0.032F, 0.083F), new Vector3(18.292F, 60.198F, 185.734F), new Vector3(0.027F, 0.027F, 0.027F));
                AddDisplayRule("TreebotBody", "FlowerBase", new Vector3(-0.485F, 0.701F, -0.803F), new Vector3(26.173F, 24.306F, 86.838F), new Vector3(0.061F, 0.061F, 0.061F));
                AddDisplayRule("LoaderBody", "Pelvis", new Vector3(-0.216F, -0.016F, -0.022F), new Vector3(342.363F, 183.205F, 159.555F), new Vector3(0.045F, 0.045F, 0.045F));
                AddDisplayRule("CrocoBody", "SpineStomach1", new Vector3(0.845F, 0.495F, 1.289F), new Vector3(74.633F, 327.618F, 247.859F), new Vector3(0.361F, 0.361F, 0.361F));
                AddDisplayRule("CaptainBody", "Stomach", new Vector3(-0.195F, 0.128F, 0.126F), new Vector3(336.504F, 156.734F, 358.159F), new Vector3(0.041F, 0.041F, 0.041F));
                AddDisplayRule("ScavBody", "Backpack", new Vector3(-5.969F, 10.94F, 0.665F), new Vector3(338.478F, 350.544F, 54.934F), new Vector3(1.363F, 1.363F, 1.363F));
                AddDisplayRule("EquipmentDroneBody", "GunBarrelBase", new Vector3(0F, 0F, 1.1F), new Vector3(52.577F, 0F, 0.001F), new Vector3(0.283F, 0.283F, 0.283F));
                if (SoftDependencies.SoftDependenciesCore.itemDisplaysSniper)
                {
                    AddDisplayRule("SniperClassicBody", "Pelvis", new Vector3(0.24189F, 0.23523F, -0.05035F), new Vector3(309.5458F, 359.9093F, 0.10958F), new Vector3(0.04303F, 0.04303F, 0.04303F));
                }
                AddDisplayRule("RailgunnerBody", "Stomach", new Vector3(0.10961F, -0.09564F, 0.08252F), new Vector3(0F, 0F, 189.4295F), new Vector3(0.04997F, 0.04997F, 0.04997F));
                AddDisplayRule("VoidSurvivorBody", "Head", new Vector3(-0.17006F, 0.12587F, 0.08001F), new Vector3(324.1714F, 170.6519F, 135.1764F), new Vector3(0.04652F, 0.04652F, 0.04652F));
            };

            crosshairPrefab = PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load <GameObject>("Prefabs/WoodSpriteIndicator"), "MysticsItems_PrinterHackerIndicator", false);
            Object.Destroy(crosshairPrefab.GetComponentInChildren <Rewired.ComponentControls.Effects.RotateAroundAxis>());
            crosshairPrefab.GetComponentInChildren <SpriteRenderer>().sprite             = Main.AssetBundle.LoadAsset <Sprite>("Assets/Equipment/Wirehack Wrench/Crosshair.png");
            crosshairPrefab.GetComponentInChildren <SpriteRenderer>().color              = new Color32(255, 235, 75, 255);
            crosshairPrefab.GetComponentInChildren <SpriteRenderer>().transform.rotation = Quaternion.identity;
            crosshairPrefab.GetComponentInChildren <TMPro.TextMeshPro>().color           = new Color32(255, 235, 75, 255);
            while (crosshairPrefab.GetComponentInChildren <ObjectScaleCurve>().overallCurve.length > 0)
            {
                crosshairPrefab.GetComponentInChildren <ObjectScaleCurve>().overallCurve.RemoveKey(0);
            }
            crosshairPrefab.GetComponentInChildren <ObjectScaleCurve>().overallCurve.AddKey(0f, 2f);
            crosshairPrefab.GetComponentInChildren <ObjectScaleCurve>().overallCurve.AddKey(0.5f, 1f);
            crosshairPrefab.GetComponentInChildren <ObjectScaleCurve>().overallCurve.AddKey(1f, 1f);

            UseTargetFinder(TargetFinderType.Custom);

            On.RoR2.PurchaseInteraction.Awake += (orig, self) =>
            {
                orig(self);
                string properName = MysticsRisky2Utils.Utils.TrimCloneFromString(self.name);
                if (properName == "Duplicator" ||
                    properName == "DuplicatorLarge" ||
                    properName == "DuplicatorWild" ||
                    properName == "DuplicatorMilitary")
                {
                    Transform transform = self.transform.Find("mdlDuplicator/DuplicatorMesh");
                    if (transform)
                    {
                        MysticsItemsDuplicatorLocator component = self.gameObject.AddComponent <MysticsItemsDuplicatorLocator>();
                        component.childTransform = transform;
                    }
                }
            };

            On.RoR2.EquipmentSlot.Update += (orig, self) =>
            {
                orig(self);
                if (self.equipmentIndex == equipmentDef.equipmentIndex)
                {
                    MysticsRisky2UtilsEquipmentTarget targetInfo = self.GetComponent <MysticsRisky2UtilsEquipmentTarget>();
                    if (targetInfo)
                    {
                        DuplicatorSearch duplicatorSearch = targetInfo.GetCustomTargetFinder <DuplicatorSearch>();
                        float            num;
                        Ray aimRay = CameraRigController.ModifyAimRayIfApplicable(self.GetAimRay(), self.gameObject, out num);
                        duplicatorSearch.searchOrigin           = aimRay.origin;
                        duplicatorSearch.searchDirection        = aimRay.direction;
                        duplicatorSearch.minAngleFilter         = 0f;
                        duplicatorSearch.maxAngleFilter         = 10f;
                        duplicatorSearch.minDistanceFilter      = 0f;
                        duplicatorSearch.maxDistanceFilter      = 30f + num;
                        duplicatorSearch.filterByDistinctEntity = false;
                        duplicatorSearch.filterByLoS            = true;
                        duplicatorSearch.sortMode = SortMode.DistanceAndAngle;
                        MysticsItemsDuplicatorLocator duplicator = duplicatorSearch.SearchCandidatesForSingleTarget(InstanceTracker.GetInstancesList <MysticsItemsDuplicatorLocator>());
                        if (duplicator)
                        {
                            targetInfo.obj = duplicator.gameObject;
                            targetInfo.indicator.visualizerPrefab = crosshairPrefab;
                            targetInfo.indicator.targetTransform  = duplicator.childTransform;
                        }
                        else
                        {
                            targetInfo.Invalidate();
                        }
                        targetInfo.indicator.active = duplicator;
                    }
                }
            };
        }
示例#13
0
        public override void OnLoad()
        {
            equipmentDef.name = "MysticsItems_OmarHackTool";
            ConfigManager.Balance.CreateEquipmentCooldownOption(equipmentDef, "Equipment: From Omar With Love", 60f);
            equipmentDef.canDrop = true;
            ConfigManager.Balance.CreateEquipmentEnigmaCompatibleOption(equipmentDef, "Equipment: From Omar With Love", false);
            ConfigManager.Balance.CreateEquipmentCanBeRandomlyTriggeredOption(equipmentDef, "Equipment: From Omar With Love", false);
            equipmentDef.pickupModelPrefab = PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/From Omar With Love/Model.prefab"));
            equipmentDef.pickupIconSprite  = Main.AssetBundle.LoadAsset <Sprite>("Assets/Equipment/From Omar With Love/Icon.png");

            ModelPanelParameters modelPanelParameters = equipmentDef.pickupModelPrefab.GetComponent <ModelPanelParameters>();

            modelPanelParameters.minDistance = 3f;
            modelPanelParameters.maxDistance = 15f;

            itemDisplayPrefab = PrepareItemDisplayModel(PrefabAPI.InstantiateClone(equipmentDef.pickupModelPrefab, equipmentDef.pickupModelPrefab.name + "Display", false));
            var itemDisplayHelper = itemDisplayPrefab.AddComponent <MysticsItemsOmarHackToolItemDisplayHelper>();

            itemDisplayHelper.hologramObject = itemDisplayPrefab.transform.Find("HologramPivot").gameObject;
            onSetupIDRS += () =>
            {
                AddDisplayRule("CommandoBody", "Stomach", new Vector3(0.07132F, 0.06612F, 0.16335F), new Vector3(356.4405F, 183.4027F, 175.2333F), new Vector3(0.05273F, 0.05273F, 0.05273F));
                AddDisplayRule("HuntressBody", "Pelvis", new Vector3(0.16212F, -0.06929F, -0.04928F), new Vector3(346.9094F, 305.4124F, 344.1372F), new Vector3(0.05129F, 0.05129F, 0.05129F));
                AddDisplayRule("Bandit2Body", "Stomach", new Vector3(-0.08026F, 0.03366F, -0.14135F), new Vector3(25.90035F, 4.31119F, 171.9758F), new Vector3(0.05568F, 0.05568F, 0.05568F));
                AddDisplayRule("ToolbotBody", "Head", new Vector3(2.44491F, 1.16734F, 0.31814F), new Vector3(327.4072F, -0.00001F, 88.11515F), new Vector3(0.88852F, 0.88852F, 0.88852F));
                AddDisplayRule("EngiBody", "LowerArmL", new Vector3(0.00352F, 0.24612F, -0.05998F), new Vector3(0.32021F, 358.9018F, 358.6807F), new Vector3(0.05067F, 0.05067F, 0.05067F));
                AddDisplayRule("MageBody", "Pelvis", new Vector3(-0.17887F, -0.07933F, -0.17931F), new Vector3(357.9544F, 233.4202F, 346.881F), new Vector3(0.04982F, 0.04982F, 0.04982F));
                AddDisplayRule("MercBody", "Pelvis", new Vector3(0.1129F, 0.0254F, -0.17644F), new Vector3(13.57408F, 151.9048F, 358.9593F), new Vector3(0.05206F, 0.05206F, 0.05206F));
                AddDisplayRule("TreebotBody", "WeaponPlatformEnd", new Vector3(0.00002F, 0.09097F, 0.24047F), new Vector3(0F, 0F, 0F), new Vector3(0.11139F, 0.11139F, 0.11139F));
                AddDisplayRule("LoaderBody", "MechBase", new Vector3(0.23928F, -0.07178F, 0.33048F), new Vector3(356.9285F, 91.33677F, 183.2036F), new Vector3(0.06152F, 0.06152F, 0.06152F));
                AddDisplayRule("CrocoBody", "LowerArmR", new Vector3(0.59287F, 4.87558F, 0.47809F), new Vector3(359.8608F, 58.79917F, 8.98919F), new Vector3(0.55777F, 0.55777F, 0.55777F));
                AddDisplayRule("CaptainBody", "Stomach", new Vector3(0.15397F, 0.13966F, 0.16991F), new Vector3(356.0198F, 17.26032F, 189.3092F), new Vector3(0.05578F, 0.05578F, 0.05578F));
                AddDisplayRule("ScavBody", "MuzzleEnergyCannon", new Vector3(4.83208F, -2.97995F, -10.98303F), new Vector3(0F, 0F, 56.95893F), new Vector3(1.363F, 1.363F, 1.363F));
                AddDisplayRule("EquipmentDroneBody", "HeadCenter", new Vector3(0.92365F, 0F, -0.60534F), new Vector3(270F, 270F, 0F), new Vector3(0.32166F, 0.32166F, 0.32166F));
                if (SoftDependencies.SoftDependenciesCore.itemDisplaysSniper)
                {
                    AddDisplayRule("SniperClassicBody", "Pelvis", new Vector3(0.15563F, 0.20335F, 0.15945F), new Vector3(358.1388F, 35.73481F, 190.192F), new Vector3(0.053F, 0.053F, 0.053F));
                }
                AddDisplayRule("RailgunnerBody", "Backpack", new Vector3(-0.14103F, -0.39243F, -0.12953F), new Vector3(-0.00001F, 180F, 180F), new Vector3(0.092F, 0.092F, 0.092F));
                AddDisplayRule("VoidSurvivorBody", "Chest", new Vector3(0.37032F, 0.42285F, -0.10184F), new Vector3(62.57283F, 57.94892F, 316.8636F), new Vector3(0.09658F, 0.09658F, 0.09658F));
            };

            crosshairPrefab = PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load <GameObject>("Prefabs/WoodSpriteIndicator"), "MysticsItems_OmarHackToolIndicator", false);
            var spriteTransform  = crosshairPrefab.GetComponentInChildren <SpriteRenderer>().transform;
            var rotateComponent  = crosshairPrefab.GetComponentInChildren <Rewired.ComponentControls.Effects.RotateAroundAxis>();
            var crosshairSprites = Main.AssetBundle.LoadAssetWithSubAssets <Sprite>("Assets/Equipment/From Omar With Love/HoverIndicator.png");

            for (var i = 0; i < crosshairSprites.Length; i++)
            {
                var spriteTransform2 = Object.Instantiate(spriteTransform.gameObject, spriteTransform);
                var spriteRenderer   = spriteTransform2.GetComponent <SpriteRenderer>();
                spriteRenderer.sprite             = crosshairSprites[i];
                spriteRenderer.color              = new Color32(0, 255, 127, 255);
                spriteRenderer.transform.rotation = Quaternion.identity;
                var rotateComponent2 = spriteTransform2.GetComponent <Rewired.ComponentControls.Effects.RotateAroundAxis>();
                rotateComponent2.rotateAroundAxis  = rotateComponent.rotateAroundAxis;
                rotateComponent2.relativeTo        = rotateComponent.relativeTo;
                rotateComponent2.speed             = Rewired.ComponentControls.Effects.RotateAroundAxis.Speed.Slow;
                rotateComponent2.slowRotationSpeed = (i + 1) * 25f;
                rotateComponent2.reverse           = (i % 2) == 0;
                Object.Destroy(spriteTransform2.GetComponent <ObjectScaleCurve>());
            }
            Object.Destroy(spriteTransform.GetComponent <SpriteRenderer>());
            Object.Destroy(rotateComponent);
            crosshairPrefab.GetComponentInChildren <TMPro.TextMeshPro>().color = new Color32(0, 255, 127, 255);
            while (crosshairPrefab.GetComponentInChildren <ObjectScaleCurve>().overallCurve.length > 0)
            {
                crosshairPrefab.GetComponentInChildren <ObjectScaleCurve>().overallCurve.RemoveKey(0);
            }
            crosshairPrefab.GetComponentInChildren <ObjectScaleCurve>().overallCurve.AddKey(0f, 0f);
            crosshairPrefab.GetComponentInChildren <ObjectScaleCurve>().overallCurve.AddKey(0.5f, 1f);
            crosshairPrefab.GetComponentInChildren <ObjectScaleCurve>().overallCurve.AddKey(1f, 1f);

            UseTargetFinder(TargetFinderType.Custom);

            On.RoR2.PurchaseInteraction.Awake += (orig, self) =>
            {
                orig(self);
                var purchaseInteraction = self.GetComponent <PurchaseInteraction>();
                if (purchaseInteraction && purchaseInteraction.costType == CostTypeIndex.Money && (self.displayNameToken.Contains("CHEST") || self.displayNameToken.Contains("SHRINE")))
                {
                    ModelLocator modelLocator = self.GetComponent <ModelLocator>();
                    if (modelLocator && modelLocator.modelTransform)
                    {
                        MysticsItemsChestLocator component = self.gameObject.AddComponent <MysticsItemsChestLocator>();
                        component.childTransform = modelLocator.modelTransform;
                    }
                }
            };

            On.RoR2.EquipmentSlot.Update += (orig, self) =>
            {
                orig(self);
                if (self.equipmentIndex == equipmentDef.equipmentIndex)
                {
                    MysticsRisky2UtilsEquipmentTarget targetInfo = self.GetComponent <MysticsRisky2UtilsEquipmentTarget>();
                    if (targetInfo)
                    {
                        var component = self.GetComponent <MysticsItemsOmarHackToolBehaviour>();
                        if (component && component.usesLeft > 0)
                        {
                            ChestSearch duplicatorSearch = targetInfo.GetCustomTargetFinder <ChestSearch>();
                            float       num;
                            Ray         aimRay = CameraRigController.ModifyAimRayIfApplicable(self.GetAimRay(), self.gameObject, out num);
                            duplicatorSearch.searchOrigin           = aimRay.origin;
                            duplicatorSearch.searchDirection        = aimRay.direction;
                            duplicatorSearch.minAngleFilter         = 0f;
                            duplicatorSearch.maxAngleFilter         = 10f;
                            duplicatorSearch.minDistanceFilter      = 0f;
                            duplicatorSearch.maxDistanceFilter      = 30f + num;
                            duplicatorSearch.filterByDistinctEntity = false;
                            duplicatorSearch.filterByLoS            = true;
                            duplicatorSearch.sortMode = SortMode.DistanceAndAngle;
                            MysticsItemsChestLocator duplicator = duplicatorSearch.SearchCandidatesForSingleTarget(InstanceTracker.GetInstancesList <MysticsItemsChestLocator>());
                            if (duplicator)
                            {
                                targetInfo.obj = duplicator.gameObject;
                                targetInfo.indicator.visualizerPrefab = crosshairPrefab;
                                targetInfo.indicator.targetTransform  = duplicator.childTransform;
                            }
                            else
                            {
                                targetInfo.Invalidate();
                            }
                            targetInfo.indicator.active = duplicator;
                        }
                        else
                        {
                            targetInfo.Invalidate();
                            targetInfo.indicator.active = false;
                        }
                    }
                }
            };

            On.RoR2.EquipmentSlot.Start              += EquipmentSlot_Start;
            On.RoR2.EquipmentSlot.ExecuteIfReady     += EquipmentSlot_ExecuteIfReady;
            On.RoR2.EquipmentSlot.UpdateInventory    += EquipmentSlot_UpdateInventory;
            On.RoR2.CharacterBody.OnInventoryChanged += CharacterBody_OnInventoryChanged;
            Stage.onStageStartGlobal     += Stage_onStageStartGlobal;
            HUD.onHudTargetChangedGlobal += HUD_onHudTargetChangedGlobal;

            On.RoR2.UI.EquipmentIcon.Update += EquipmentIcon_Update;

            hudPrefab = Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/From Omar With Love/OverEquipmentIcon.prefab");
            var hudComp = hudPrefab.AddComponent <MysticsItemsOmarHackToolHUD>();

            hudComp.usesLeftText      = hudPrefab.transform.Find("UsesText").GetComponent <TextMeshProUGUI>();
            hudComp.usesLeftText.font = HGTextMeshProUGUI.defaultLanguageFont;

            hackVFXPrefab = Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/From Omar With Love/HackVFX.prefab");
            EffectComponent effectComponent = hackVFXPrefab.AddComponent <EffectComponent>();

            effectComponent.applyScale = true;
            effectComponent.soundName  = "MysticsItems_Play_env_OmarHackTool";
            VFXAttributes vfxAttributes = hackVFXPrefab.AddComponent <VFXAttributes>();

            vfxAttributes.vfxIntensity = VFXAttributes.VFXIntensity.Low;
            vfxAttributes.vfxPriority  = VFXAttributes.VFXPriority.Medium;
            hackVFXPrefab.AddComponent <DestroyOnTimer>().duration = 10f;
            MysticsItemsContent.Resources.effectPrefabs.Add(hackVFXPrefab);

            On.RoR2.ChestBehavior.ItemDrop += ChestBehavior_ItemDrop;

            hackOverlayPrefab = PrefabAPI.InstantiateClone(new GameObject(), "MysticsItems_OmarHackToolHackOverlay", false);
            EntityStateMachine entityStateMachine = hackOverlayPrefab.AddComponent <EntityStateMachine>();

            entityStateMachine.initialStateType = entityStateMachine.mainStateType = new EntityStates.SerializableEntityStateType(typeof(MysticsItemsOmarHackToolOverlay));
            effectComponent = hackOverlayPrefab.AddComponent <EffectComponent>();
            effectComponent.parentToReferencedTransform = true;
            vfxAttributes = hackOverlayPrefab.AddComponent <VFXAttributes>();
            vfxAttributes.vfxIntensity = VFXAttributes.VFXIntensity.Low;
            vfxAttributes.vfxPriority  = VFXAttributes.VFXPriority.Low;
            MysticsItemsContent.Resources.effectPrefabs.Add(hackOverlayPrefab);
        }
示例#14
0
            public void FixedUpdate()
            {
                if (NetworkServer.active)
                {
                    while (enemyFollowers.Count < stack)
                    {
                        GameObject enemyFollower = Object.Instantiate(enemyFollowerPrefab, body.corePosition, Quaternion.identity);
                        enemyFollower.GetComponent <GenericOwnership>().ownerObject = gameObject;
                        NetworkServer.Spawn(enemyFollower);
                        enemyFollowers.Add(enemyFollower.GetComponent <MysticsItemsSpotterController>());
                    }
                    while (enemyFollowers.Count > stack)
                    {
                        MysticsItemsSpotterController enemyFollower = enemyFollowers.Last();
                        NetworkServer.UnSpawn(enemyFollower.gameObject);
                        Object.Destroy(enemyFollower.gameObject);
                        enemyFollowers.Remove(enemyFollower);
                    }
                }
                cooldown -= Time.fixedDeltaTime;
                if (cooldown <= 0f)
                {
                    cooldown = cooldownMax;

                    if (NetworkServer.active)
                    {
                        bullseyeSearch.teamMaskFilter = TeamMask.allButNeutral;
                        bullseyeSearch.teamMaskFilter.RemoveTeam(body.teamComponent.teamIndex);
                        Ray ray = CameraRigController.ModifyAimRayIfApplicable(new Ray
                        {
                            origin    = body.inputBank.aimOrigin,
                            direction = body.inputBank.aimDirection
                        }, body.gameObject, out _);
                        bullseyeSearch.searchOrigin      = ray.origin;
                        bullseyeSearch.searchDirection   = ray.direction;
                        bullseyeSearch.viewer            = body;
                        bullseyeSearch.maxDistanceFilter = 200f;
                        bullseyeSearch.RefreshCandidates();
                        bullseyeSearch.FilterOutGameObject(body.gameObject);
                        List <HurtBox> enemies = bullseyeSearch.GetResults().ToList();

                        foreach (MysticsItemsSpotterController enemyFollower in enemyFollowers)
                        {
                            enemyFollower.ClearTarget();
                        }

                        if (enemies.Count > 0)
                        {
                            Util.PlaySound("Play_item_proc_spotter", gameObject);
                            foreach (MysticsItemsSpotterController enemyFollower in enemyFollowers)
                            {
                                GameObject newTarget = null;
                                while (newTarget == null && enemies.Count > 0)
                                {
                                    int     index            = Mathf.FloorToInt(enemies.Count * (Random.value * 0.99f));
                                    HurtBox newTargetHurtBox = enemies.ElementAt(index);
                                    enemies.RemoveAt(index);
                                    if (newTargetHurtBox.healthComponent && newTargetHurtBox.healthComponent.body)
                                    {
                                        CharacterBody newTargetBody = newTargetHurtBox.healthComponent.body;
                                        if (!newTargetBody.HasBuff(buffDef))
                                        {
                                            newTarget = newTargetBody.gameObject;
                                        }
                                    }
                                }
                                if (newTarget)
                                {
                                    enemyFollower.SetTarget(newTarget);
                                }
                                else
                                {
                                    enemyFollower.ClearTarget();
                                }
                            }
                        }
                        else
                        {
                            cooldown = cooldownIfNoEnemiesFound;
                        }
                    }
                }
            }