internal static void PopulateHenrysAssetsThatNoLongerExist() { if (!mainAssetBundle) { Debug.LogError("There is no AssetBundle to load assets from."); return; } // feel free to delete everything in here and load in your own assets instead // it should work fine even if left as is- even if the assets aren't in the bundle swordHitSoundEvent = CreateNetworkSoundEventDef("HenrySwordHit"); bombExplosionEffect = LoadEffect("BombExplosionEffect", "HenryBombExplosion"); if (bombExplosionEffect) { ShakeEmitter shakeEmitter = bombExplosionEffect.AddComponent <ShakeEmitter>(); shakeEmitter.amplitudeTimeDecay = true; shakeEmitter.duration = 0.5f; shakeEmitter.radius = 200f; shakeEmitter.scaleShakeRadiusWithLocalScale = false; shakeEmitter.wave = new Wave { amplitude = 1f, frequency = 40f, cycleOffset = 0f }; } swordSwingEffect = Assets.LoadEffect("HenrySwordSwingEffect", true); swordHitImpactEffect = Assets.LoadEffect("ImpactHenrySlash"); }
public void TriggerPhase() { ShakeEmitter.CreateSimpleShakeEmitter(transform.position, new Wave { amplitude = 3f, frequency = 4f }, 0.15f, 50f, true); Util.PlaySound("MysticsItems_Play_env_sirenpole", gameObject); if (NetworkServer.active) { SummonEnemies(); } }
internal static void PopulateAssets() { if (mainAssetBundle == null) { using (var assetStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HenryMod.pleasechangethisnameinyourprojectorelseyouwillcauseconflicts")) { mainAssetBundle = AssetBundle.LoadFromStream(assetStream); var provider = new AssetBundleResourcesProvider("@Henry", mainAssetBundle); ResourcesAPI.AddProvider(provider); } } using (Stream manifestResourceStream2 = Assembly.GetExecutingAssembly().GetManifestResourceStream("HenryMod.HenryBank.bnk")) { byte[] array = new byte[manifestResourceStream2.Length]; manifestResourceStream2.Read(array, 0, array.Length); SoundAPI.SoundBanks.Add(array); } swordHitSoundEvent = CreateNetworkSoundEventDef("HenrySwordHit"); punchHitSoundEvent = CreateNetworkSoundEventDef("HenryPunchHit"); dustEffect = LoadEffect("HenryDustEffect"); bombExplosionEffect = LoadEffect("BombExplosionEffect"); ShakeEmitter shakeEmitter = bombExplosionEffect.AddComponent <ShakeEmitter>(); shakeEmitter.amplitudeTimeDecay = true; shakeEmitter.duration = 0.5f; shakeEmitter.radius = 200f; shakeEmitter.scaleShakeRadiusWithLocalScale = false; shakeEmitter.wave = new Wave { amplitude = 1f, frequency = 40f, cycleOffset = 0f }; swordSwingEffect = Assets.LoadEffect("HenrySwordSwingEffect"); swordHitImpactEffect = Assets.LoadEffect("ImpactHenrySlash"); punchSwingEffect = Assets.LoadEffect("HenryFistSwingEffect"); //punchImpactEffect = Assets.LoadEffect("ImpactHenryPunch"); // on second thought my effect sucks so imma just clone loader's punchImpactEffect = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Effects/OmniEffect/OmniImpactVFXLoader"), "ImpactHenryPunch"); punchImpactEffect.AddComponent <NetworkIdentity>(); EffectAPI.AddEffect(punchImpactEffect); }
private void RpcLaunch() { shkm = this.gameObject.AddComponent <ShakeEmitter>(); shkm.wave = new Wave { amplitude = 0.25f, frequency = 180f, cycleOffset = 0f }; shkm.duration = 0.45f; shkm.radius = 100f; shkm.amplitudeTimeDecay = false; launchState = 1; }
public void Awake() { holdoutZoneController.onCharged = new HoldoutZoneController.HoldoutZoneControllerChargedUnityEvent(); holdoutZoneController.onCharged.AddListener((zone) => { RunOnTeleporterChargedGlobal(GetComponent <TeleporterInteraction>()); zone.enabled = false; delay = delayMax; Util.PlaySound("Play_loader_shift_release", gameObject); ShakeEmitter.CreateSimpleShakeEmitter(transform.position, new Wave { amplitude = 7f, frequency = 2.4f }, 0.1f, zone.currentRadius, true); if (NetworkServer.active) { foreach (var purchaseInteraction in InstanceTracker.GetInstancesList <PurchaseInteraction>().Where(x => x.setUnavailableOnTeleporterActivated)) { purchaseInteraction.SetAvailable(true); } } }); holdoutZoneController.calcChargeRate += HoldoutZoneController_calcChargeRate; waveCombatDirector.currentSpawnTarget = gameObject; monsterCredit = baseMonsterCredit /* * (Run.instance ? Run.instance.difficultyCoefficient : 1f)*/; if (Physics.Raycast(transform.position, Vector3.down, out var raycastHit, 500f, LayerIndex.world.mask)) { transform.position = raycastHit.point; transform.up = raycastHit.normal; } ForceEnd(); instance = this; Util.PlaySound("MysticsItems_Play_item_use_sirenpole", gameObject); if (poleTransform) { poleTransformLocalPositionTarget = poleTransform.localPosition; poleTransform.localPosition = Vector3.zero; } ShakeEmitter.CreateSimpleShakeEmitter(transform.position, new Wave { amplitude = 0.5f, frequency = 10f }, 0.1f, 15f, true); }
public override void OnLoad() { equipmentDef.name = "MysticsItems_MechanicalArm"; ConfigManager.Balance.CreateEquipmentCooldownOption(equipmentDef, "Equipment: Mechanical Arm", 20f); equipmentDef.canDrop = true; ConfigManager.Balance.CreateEquipmentEnigmaCompatibleOption(equipmentDef, "Equipment: Mechanical Arm", true); ConfigManager.Balance.CreateEquipmentCanBeRandomlyTriggeredOption(equipmentDef, "Equipment: Mechanical Arm", false); equipmentDef.pickupModelPrefab = PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/Mechanical Arm/Model.prefab")); equipmentDef.pickupIconSprite = Main.AssetBundle.LoadAsset <Sprite>("Assets/Equipment/Mechanical Arm/Icon.png"); void ApplyToModels(GameObject model) { var mat = model.GetComponentInChildren <SkinnedMeshRenderer>().sharedMaterial; HopooShaderToMaterial.Standard.Apply(mat); HopooShaderToMaterial.Standard.Gloss(mat); HopooShaderToMaterial.Standard.Emission(mat, 1.5f, new Color32(191, 15, 3, 255)); } ApplyToModels(equipmentDef.pickupModelPrefab); ModelPanelParameters modelPanelParameters = equipmentDef.pickupModelPrefab.GetComponent <ModelPanelParameters>(); modelPanelParameters.minDistance = 6f; modelPanelParameters.maxDistance = 12f; itemDisplayPrefab = PrepareItemDisplayModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/Mechanical Arm/MovingModel.prefab")); onSetupIDRS += () => { AddDisplayRule("CommandoBody", "Chest", new Vector3(0.07816F, 0.25502F, -0.15061F), new Vector3(0F, 180F, 0F), new Vector3(0.07862F, 0.07862F, 0.07862F)); AddDisplayRule("HuntressBody", "Chest", new Vector3(0.10676F, 0.14576F, -0.04849F), new Vector3(0F, 180F, 0F), new Vector3(0.03776F, 0.03776F, 0.03776F)); AddDisplayRule("Bandit2Body", "Chest", new Vector3(0.00326F, 0.18527F, -0.12067F), new Vector3(0F, 185.5073F, 0F), new Vector3(0.05941F, 0.05941F, 0.05941F)); AddDisplayRule("ToolbotBody", "Chest", new Vector3(2.63852F, 1.90061F, 0.02656F), new Vector3(0F, 180F, 0F), new Vector3(0.56946F, 0.56946F, 0.56946F)); AddDisplayRule("EngiBody", "Chest", new Vector3(0.01994F, 0.13958F, -0.23417F), new Vector3(0F, 180F, 0F), new Vector3(0.06142F, 0.06142F, 0.06142F)); AddDisplayRule("MageBody", "Chest", new Vector3(0.09002F, 0.03363F, -0.2332F), new Vector3(0F, 175.5407F, 0F), new Vector3(0.05358F, 0.05358F, 0.05358F)); AddDisplayRule("MercBody", "Chest", new Vector3(0.00246F, 0.14756F, -0.16344F), new Vector3(0F, 202.2791F, 0F), new Vector3(0.08846F, 0.08846F, 0.08846F)); AddDisplayRule("TreebotBody", "PlatformBase", new Vector3(0.53248F, 0.66126F, 0F), new Vector3(0F, 180F, 0F), new Vector3(0.19873F, 0.19873F, 0.19873F)); AddDisplayRule("LoaderBody", "MechBase", new Vector3(-0.03249F, 0.00003F, -0.06065F), new Vector3(0F, 206.8929F, 0F), new Vector3(0.09891F, 0.09891F, 0.09796F)); AddDisplayRule("CrocoBody", "SpineChest2", new Vector3(0F, -0.86934F, 0.00013F), new Vector3(0F, 0F, 0F), new Vector3(0.83816F, 0.83816F, 0.83816F)); AddDisplayRule("CaptainBody", "Chest", new Vector3(-0.00812F, 0.17595F, -0.14316F), new Vector3(0F, 218.1953F, 0F), new Vector3(0.09604F, 0.09604F, 0.09604F)); AddDisplayRule("ScavBody", "Backpack", new Vector3(6.49963F, 6.38849F, 0.00031F), new Vector3(0F, 180F, 0F), new Vector3(2.02387F, 2.02387F, 2.02387F)); AddDisplayRule("EquipmentDroneBody", "HeadCenter", new Vector3(0.4758F, 0F, -0.48188F), new Vector3(270F, 180F, 0F), new Vector3(0.42601F, 0.42601F, 0.42601F)); if (SoftDependencies.SoftDependenciesCore.itemDisplaysSniper) { AddDisplayRule("SniperClassicBody", "Chest", new Vector3(0.1706F, 0.13246F, -0.20744F), new Vector3(0F, 180F, 0F), new Vector3(0.053F, 0.053F, 0.053F)); } AddDisplayRule("RailgunnerBody", "Backpack", new Vector3(0.08517F, 0.21948F, 0.00002F), new Vector3(0F, 180F, 0F), new Vector3(0.09344F, 0.09344F, 0.09344F)); AddDisplayRule("VoidSurvivorBody", "Center", new Vector3(-0.0074F, 0.3145F, -0.08637F), new Vector3(359.7796F, 219.7314F, 0.26983F), new Vector3(0.07043F, 0.07043F, 0.07043F)); }; ChildLocator childLocator = itemDisplayPrefab.AddComponent <ChildLocator>(); NetworkedBodyAttachment networkedBodyAttachment = mechanicalArmControllerPrefab.AddComponent <NetworkedBodyAttachment>(); networkedBodyAttachment.shouldParentToAttachedBody = true; networkedBodyAttachment.forceHostAuthority = true; EntityStateMachine entityStateMachine = mechanicalArmControllerPrefab.AddComponent <EntityStateMachine>(); entityStateMachine.initialStateType = entityStateMachine.mainStateType = new EntityStates.SerializableEntityStateType(typeof(MysticsItemsMechanicalArmState.Idle)); NetworkStateMachine networkStateMachine = mechanicalArmControllerPrefab.AddComponent <NetworkStateMachine>(); networkStateMachine.SetFieldValue("stateMachines", new EntityStateMachine[] { entityStateMachine }); MysticsItemsContent.Resources.entityStateTypes.Add(typeof(MysticsItemsMechanicalArmState)); MysticsItemsContent.Resources.entityStateTypes.Add(typeof(MysticsItemsMechanicalArmState.Idle)); MysticsItemsContent.Resources.entityStateTypes.Add(typeof(MysticsItemsMechanicalArmState.Swing)); ModelLocator modelLocator = mechanicalArmControllerPrefab.AddComponent <ModelLocator>(); modelLocator.dontReleaseModelOnDeath = false; modelLocator.autoUpdateModelTransform = false; modelLocator.dontDetatchFromParent = true; modelLocator.preserveModel = true; PrefabAPI.InstantiateClone( Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/Mechanical Arm/MovingModel.prefab") .transform.Find("HitboxGroup").gameObject, "HitboxGroup", false ).transform.SetParent(mechanicalArmControllerPrefab.transform); Object.Destroy(itemDisplayPrefab.transform.Find("HitboxGroup").gameObject); HitBoxGroup hitBoxGroup = mechanicalArmControllerPrefab.transform.Find("HitboxGroup").gameObject.AddComponent <HitBoxGroup>(); hitBoxGroup.groupName = "MysticsItems_MechanicalArmSwing"; hitBoxGroup.hitBoxes = new HitBox[] { mechanicalArmControllerPrefab.transform.Find("HitboxGroup/Hitbox").gameObject.AddComponent <HitBox>() }; hitBoxGroup.gameObject.SetActive(true); AnimationCurve MakeGenericCurve() { return(new AnimationCurve { keys = new Keyframe[] { new Keyframe(0, 1), new Keyframe(1, 1) } }); } Transform armRoot = null; foreach (var child in itemDisplayPrefab.GetComponentsInChildren <Transform>()) { var childName = child.name; if (childName == "arm.1") { armRoot = child; var ntp = new ChildLocator.NameTransformPair { name = "Arm1", transform = child }; HGArrayUtilities.ArrayAppend(ref childLocator.transformPairs, ref ntp); } else { if (childName.StartsWith("arm.", false, System.Globalization.CultureInfo.InvariantCulture)) { var ntp = new ChildLocator.NameTransformPair { name = "Arm" + childName.Remove(0, "arm.".Length), transform = child }; HGArrayUtilities.ArrayAppend(ref childLocator.transformPairs, ref ntp); DynamicBone dynamicBone = child.gameObject.AddComponent <DynamicBone>(); dynamicBone.m_Root = child; dynamicBone.m_UpdateRate = 60; dynamicBone.m_UpdateMode = DynamicBone.UpdateMode.Normal; dynamicBone.m_Damping = 0.8f; dynamicBone.m_DampingDistrib = MakeGenericCurve(); dynamicBone.m_Elasticity = 0.1f; dynamicBone.m_ElasticityDistrib = MakeGenericCurve(); dynamicBone.m_Stiffness = 0.9f; dynamicBone.m_StiffnessDistrib = MakeGenericCurve(); dynamicBone.m_Inert = 0f; dynamicBone.m_InertDistrib = MakeGenericCurve(); dynamicBone.m_Radius = 0f; dynamicBone.m_RadiusDistrib = MakeGenericCurve(); } } } On.RoR2.EquipmentSlot.FixedUpdate += (orig, self) => { orig(self); if (NetworkServer.active) { MysticsItemsMechanicalArmState armController = MysticsItemsMechanicalArmState.FindMechanicalArmController(self.gameObject); bool carryingThisEquipment = self.equipmentIndex == equipmentDef.equipmentIndex; if (carryingThisEquipment != (armController != null)) { if (carryingThisEquipment) { var armControllerInstance = Object.Instantiate <GameObject>(mechanicalArmControllerPrefab); armControllerInstance.GetComponent <NetworkedBodyAttachment>().AttachToGameObjectAndSpawn(self.gameObject); return; } Object.Destroy(armController.gameObject); } } }; var swingEffectPrefab = MysticsItemsMechanicalArmState.Swing.swingEffectPrefab = Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/Mechanical Arm/SwingEffect.prefab"); ScaleParticleSystemDuration scaleParticleSystemDuration = swingEffectPrefab.AddComponent <ScaleParticleSystemDuration>(); scaleParticleSystemDuration.particleSystems = swingEffectPrefab.GetComponentsInChildren <ParticleSystem>(); scaleParticleSystemDuration.initialDuration = 1f; ShakeEmitter shakeEmitter = swingEffectPrefab.AddComponent <ShakeEmitter>(); shakeEmitter.duration = 0.2f; shakeEmitter.radius = 20f; shakeEmitter.wave = new Wave { amplitude = 4f, frequency = 4f }; shakeEmitter.amplitudeTimeDecay = true; shakeEmitter.shakeOnStart = true; shakeEmitter.shakeOnEnable = false; MysticsItemsMechanicalArmState.Swing.hitEffectPrefab = LegacyResourcesAPI.Load <GameObject>("Prefabs/Effects/ImpactEffects/SawmerangImpact"); var snd = ScriptableObject.CreateInstance <NetworkSoundEventDef>(); snd.eventName = "MysticsItems_Play_mechanicalArm_impact"; MysticsItemsContent.Resources.networkSoundEventDefs.Add(snd); MysticsItemsMechanicalArmState.Swing.impactSound = snd; GenericGameEvents.OnHitEnemy += GenericGameEvents_OnHitEnemy; RecalculateStatsAPI.GetStatCoefficients += RecalculateStatsAPI_GetStatCoefficients; }
internal static void PopulateAssets() { if (!mainAssetBundle) { Debug.LogError("There is no AssetBundle to load assets from."); return; } swordHitSoundEvent = CreateNetworkSoundEventDef("HenrySwordHit"); punchHitSoundEvent = CreateNetworkSoundEventDef("HenryPunchHit"); nemSwordHitSoundEvent = CreateNetworkSoundEventDef("NemrySwordHit"); dustEffect = LoadEffect("HenryDustEffect"); bombExplosionEffect = LoadEffect("BombExplosionEffect", "HenryBombExplosion"); bazookaExplosionEffect = LoadEffect("HenryBazookaExplosionEffect", "HenryBazookaExplosion"); bazookaMuzzleFlash = LoadEffect("HenryBazookaMuzzleFlash"); muzzleFlashEnergy = LoadEffect("NemryMuzzleFlashEnergy", true); minibossEffect = mainAssetBundle.LoadAsset <GameObject>("NemryMinibossIndicator"); swordChargeFinishEffect = LoadEffect("SwordChargeFinishEffect"); swordChargeEffect = mainAssetBundle.LoadAsset <GameObject>("SwordChargeEffect"); if (swordChargeEffect) { swordChargeEffect.AddComponent <ScaleParticleSystemDuration>().particleSystems = swordChargeEffect.GetComponentsInChildren <ParticleSystem>(); swordChargeEffect.GetComponent <ScaleParticleSystemDuration>().initialDuration = 1.5f; } if (bombExplosionEffect) { ShakeEmitter shakeEmitter = bombExplosionEffect.AddComponent <ShakeEmitter>(); shakeEmitter.amplitudeTimeDecay = true; shakeEmitter.duration = 0.5f; shakeEmitter.radius = 200f; shakeEmitter.scaleShakeRadiusWithLocalScale = false; shakeEmitter.wave = new Wave { amplitude = 1f, frequency = 40f, cycleOffset = 0f }; shakeEmitter = bazookaExplosionEffect.AddComponent <ShakeEmitter>(); shakeEmitter.amplitudeTimeDecay = true; shakeEmitter.duration = 0.4f; shakeEmitter.radius = 100f; shakeEmitter.scaleShakeRadiusWithLocalScale = false; shakeEmitter.wave = new Wave { amplitude = 1f, frequency = 30f, cycleOffset = 0f }; } swordSwingEffect = Assets.LoadEffect("HenrySwordSwingEffect", true); swordHitImpactEffect = Assets.LoadEffect("ImpactHenrySlash"); punchSwingEffect = Assets.LoadEffect("HenryFistSwingEffect", true); punchImpactEffect = Assets.LoadEffect("ImpactHenryPunch"); fistBarrageEffect = Assets.LoadEffect("FistBarrageEffect", true); if (fistBarrageEffect) { fistBarrageEffect.GetComponent <ParticleSystemRenderer>().material.shader = hotpoo; } bazookaCrosshair = PrefabAPI.InstantiateClone(LoadCrosshair("ToolbotGrenadeLauncher"), "HenryBazookaCrosshair", false); CrosshairController crosshair = bazookaCrosshair.GetComponent <CrosshairController>(); crosshair.skillStockSpriteDisplays = new CrosshairController.SkillStockSpriteDisplay[0]; bazookaCrosshair.transform.Find("StockCountHolder").gameObject.SetActive(false); bazookaCrosshair.transform.Find("Image, Arrow (1)").gameObject.SetActive(true); crosshair.spriteSpreadPositions[0].zeroPosition = new Vector3(32f, 34f, 0f); crosshair.spriteSpreadPositions[2].zeroPosition = new Vector3(-32f, 34f, 0f); bazookaCrosshair.transform.GetChild(1).gameObject.SetActive(false); trackerPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/HuntressTrackingIndicator"), "HenryTrackerPrefab", false); trackerPrefab.transform.Find("Core Pip").gameObject.GetComponent <SpriteRenderer>().color = Color.white; trackerPrefab.transform.Find("Core Pip").localScale = new Vector3(0.15f, 0.15f, 0.15f); trackerPrefab.transform.Find("Core, Dark").gameObject.GetComponent <SpriteRenderer>().color = Color.black; trackerPrefab.transform.Find("Core, Dark").localScale = new Vector3(0.1f, 0.1f, 0.1f); foreach (SpriteRenderer i in trackerPrefab.transform.Find("Holder").gameObject.GetComponentsInChildren <SpriteRenderer>()) { if (i) { i.gameObject.transform.localScale = new Vector3(0.2f, 0.2f, 1f); i.color = Color.white; } } shotgunTracer = Resources.Load <GameObject>("Prefabs/Effects/Tracers/TracerCommandoShotgun").InstantiateClone("HenryBulletTracer", true); if (!shotgunTracer.GetComponent <EffectComponent>()) { shotgunTracer.AddComponent <EffectComponent>(); } if (!shotgunTracer.GetComponent <VFXAttributes>()) { shotgunTracer.AddComponent <VFXAttributes>(); } if (!shotgunTracer.GetComponent <NetworkIdentity>()) { shotgunTracer.AddComponent <NetworkIdentity>(); } foreach (LineRenderer i in shotgunTracer.GetComponentsInChildren <LineRenderer>()) { if (i) { Material bulletMat = UnityEngine.Object.Instantiate <Material>(i.material); bulletMat.SetColor("_TintColor", new Color(0.68f, 0.58f, 0.05f)); i.material = bulletMat; i.startColor = new Color(0.68f, 0.58f, 0.05f); i.endColor = new Color(0.68f, 0.58f, 0.05f); } } AddNewEffectDef(shotgunTracer); spearSwingEffect = Assets.LoadEffect("NemrySpearSwingEffect"); nemSwordSwingEffect = Assets.LoadEffect("NemrySwordSwingEffect", true); nemSwordStabSwingEffect = Assets.LoadEffect("NemrySwordStabSwingEffect", true); nemSwordHeavySwingEffect = Assets.LoadEffect("NemryHeavySwordSwingEffect", true); nemSwordHitImpactEffect = Assets.LoadEffect("ImpactNemrySlash"); energyBurstEffect = LoadEffect("EnergyBurstEffect"); smallEnergyBurstEffect = LoadEffect("EnergySmallBurstEffect"); energyTracer = CreateTracer("TracerHuntressSnipe", "NemryEnergyTracer"); LineRenderer line = energyTracer.transform.Find("TracerHead").GetComponent <LineRenderer>(); Material tracerMat = UnityEngine.Object.Instantiate <Material>(line.material); line.startWidth *= 0.25f; line.endWidth *= 0.25f; // this did not work. //tracerMat.SetColor("_TintColor", new Color(78f / 255f, 80f / 255f, 111f / 255f)); line.material = tracerMat; }
public override void OnLoad() { base.OnLoad(); itemDef.name = "MysticsItems_TreasureMap"; SetItemTierWhenAvailable(ItemTier.Tier3); itemDef.tags = new ItemTag[] { ItemTag.Utility, ItemTag.AIBlacklist, ItemTag.CannotCopy }; itemDef.pickupModelPrefab = PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Treasure Map/Model.prefab")); itemDef.pickupIconSprite = Main.AssetBundle.LoadAsset <Sprite>("Assets/Items/Treasure Map/Icon.png"); ModelPanelParameters modelPanelParams = itemDef.pickupModelPrefab.GetComponentInChildren <ModelPanelParameters>(); modelPanelParams.minDistance = 3; modelPanelParams.maxDistance = 6; itemDisplayPrefab = PrepareItemDisplayModel(PrefabAPI.InstantiateClone(itemDef.pickupModelPrefab, itemDef.pickupModelPrefab.name + "Display", false)); onSetupIDRS += () => { AddDisplayRule("CommandoBody", "LowerArmR", new Vector3(-0.084F, 0.183F, -0.006F), new Vector3(83.186F, 36.557F, 131.348F), new Vector3(0.053F, 0.053F, 0.053F)); AddDisplayRule("HuntressBody", "Muzzle", new Vector3(-0.527F, -0.032F, -0.396F), new Vector3(0.509F, 134.442F, 184.268F), new Vector3(0.042F, 0.042F, 0.042F)); AddDisplayRule("Bandit2Body", "MuzzleShotgun", new Vector3(0.014F, -0.07F, -0.668F), new Vector3(0F, 180F, 180F), new Vector3(0.04F, 0.04F, 0.04F)); AddDisplayRule("ToolbotBody", "Head", new Vector3(0.198F, 3.655F, -0.532F), new Vector3(304.724F, 180F, 180F), new Vector3(0.448F, 0.448F, 0.448F)); AddDisplayRule("EngiBody", "WristDisplay", new Vector3(0.01F, -0.001F, 0.007F), new Vector3(86.234F, 155.949F, 155.218F), new Vector3(0.065F, 0.065F, 0.065F)); AddDisplayRule("MageBody", "LowerArmR", new Vector3(0.116F, 0.188F, 0.008F), new Vector3(88.872F, 20.576F, 290.58F), new Vector3(0.074F, 0.074F, 0.074F)); AddDisplayRule("MercBody", "LowerArmR", new Vector3(-0.01F, 0.144F, -0.116F), new Vector3(277.017F, 64.808F, 295.358F), new Vector3(0.072F, 0.072F, 0.072F)); AddDisplayRule("TreebotBody", "HeadBase", new Vector3(-0.013F, 0.253F, -0.813F), new Vector3(1.857F, 5.075F, 0.053F), new Vector3(0.13F, 0.143F, 0.294F)); AddDisplayRule("LoaderBody", "MechLowerArmR", new Vector3(-0.01F, 0.544F, -0.144F), new Vector3(275.35F, 95.995F, 266.284F), new Vector3(0.095F, 0.095F, 0.095F)); AddDisplayRule("CrocoBody", "UpperArmR", new Vector3(1.735F, -0.575F, 0.196F), new Vector3(281.472F, 180.072F, 89.927F), new Vector3(0.868F, 0.868F, 0.868F)); AddDisplayRule("CaptainBody", "HandR", new Vector3(-0.066F, 0.087F, 0.011F), new Vector3(76.759F, 135.292F, 224.52F), new Vector3(0.059F, 0.053F, 0.059F)); AddDisplayRule("BrotherBody", "HandR", BrotherInfection.red, new Vector3(0.051F, -0.072F, 0.004F), new Vector3(44.814F, 122.901F, 267.545F), new Vector3(0.063F, 0.063F, 0.063F)); if (SoftDependencies.SoftDependenciesCore.itemDisplaysSniper) { AddDisplayRule("SniperClassicBody", "Chest", new Vector3(-0.10307F, 0.44329F, -0.26101F), new Vector3(0F, 0F, 0F), new Vector3(0.05402F, 0.05402F, 0.05402F)); } AddDisplayRule("RailgunnerBody", "GunRoot", new Vector3(0.00726F, -0.15201F, 0.07672F), new Vector3(270F, 180F, 0F), new Vector3(0.05025F, 0.05025F, 0.05025F)); AddDisplayRule("VoidSurvivorBody", "ForeArmL", new Vector3(0.06352F, 0.24419F, 0.00664F), new Vector3(69.26795F, 34.44471F, 302.5876F), new Vector3(0.05926F, 0.05926F, 0.05926F)); }; MysticsRisky2Utils.Utils.CopyChildren(Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Treasure Map/TreasureMapZone.prefab"), zonePrefab); HoldoutZoneController holdoutZone = zonePrefab.AddComponent <HoldoutZoneController>(); holdoutZone.baseRadius = radius; holdoutZone.baseChargeDuration = unearthTime; holdoutZone.radiusSmoothTime = 1f; holdoutZone.radiusIndicator = zonePrefab.transform.Find("Visuals/Sphere").gameObject.GetComponent <Renderer>(); holdoutZone.inBoundsObjectiveToken = "OBJECTIVE_MYSTICSITEMS_CHARGE_TREASUREMAPZONE"; holdoutZone.outOfBoundsObjectiveToken = "OBJECTIVE_MYSTICSITEMS_CHARGE_TREASUREMAPZONE_OOB"; holdoutZone.applyHealingNova = true; holdoutZone.applyFocusConvergence = true; holdoutZone.playerCountScaling = 0f; // Charge by 1 second regardless of how many players are charging the zone holdoutZone.dischargeRate = 0f; holdoutZone.enabled = false; MysticsItemsTreasureMapZone captureZone = zonePrefab.AddComponent <MysticsItemsTreasureMapZone>(); captureZone.itemDef = itemDef; captureZone.dropTable = Addressables.LoadAssetAsync <PickupDropTable>("RoR2/Base/GoldChest/dtGoldChest.asset").WaitForCompletion(); captureZone.dropTransform = zonePrefab.transform.Find("DropPivot"); HologramProjector hologramProjector = zonePrefab.AddComponent <HologramProjector>(); hologramProjector.displayDistance = holdoutZone.baseRadius; hologramProjector.hologramPivot = zonePrefab.transform.Find("HologramPivot"); hologramProjector.hologramPivot.transform.localScale *= 2f; hologramProjector.disableHologramRotation = false; captureZone.hologramProjector = hologramProjector; Decal decal = zonePrefab.transform.Find("Decal").gameObject.AddComponent <Decal>(); decal.RenderMode = Decal.DecalRenderMode.Deferred; Material decalMaterial = new Material(LegacyShaderAPI.Find("Decalicious/Deferred Decal")); decal.Material = decalMaterial; decalMaterial.name = "MysticsItems_TreasureMapDecal"; Texture decalTexture = Main.AssetBundle.LoadAsset <Texture>("Assets/Items/Treasure Map/texTreasureMapDecal.png"); decalMaterial.SetTexture("_MainTex", decalTexture); decalMaterial.SetTexture("_MaskTex", decalTexture); decalMaterial.SetFloat("_AngleLimit", 0.6f); decalMaterial.SetFloat("_DecalLayer", 1f); decalMaterial.SetFloat("_DecalBlendMode", 0f); decalMaterial.SetColor("_Color", new Color32(70, 10, 10, 255)); decalMaterial.SetColor("_EmissionColor", Color.black); decal.Fade = 1f; decal.DrawAlbedo = true; decal.UseLightProbes = true; decal.DrawNormalAndGloss = false; decal.HighQualityBlending = false; { decal.GetComponent <MeshFilter>().sharedMesh = LegacyResourcesAPI.Load <Mesh>("DecalCube"); MeshRenderer component = decal.GetComponent <MeshRenderer>(); component.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; component.receiveShadows = false; component.materials = new Material[0]; component.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.BlendProbes; component.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off; } decal.gameObject.transform.localScale = Vector3.one * 10f; HG.ArrayUtils.ArrayAppend(ref captureZone.toggleObjects, decal.gameObject); On.RoR2.HoldoutZoneController.ChargeHoldoutZoneObjectiveTracker.ShouldBeFlashing += (orig, self) => { if (self.sourceDescriptor.master) { HoldoutZoneController holdoutZoneController = (HoldoutZoneController)self.sourceDescriptor.source; if (holdoutZoneController && holdoutZoneController.gameObject.GetComponent <MysticsItemsTreasureMapZone>()) { var teleporterInteraction = TeleporterInteraction.instance; if (teleporterInteraction && teleporterInteraction.isCharged) { return(true); } return(false); } } return(orig(self)); }; zoneSpawnCard = ScriptableObject.CreateInstance <SpawnCard>(); zoneSpawnCard.name = "iscMysticsItems_TreasureMapZone"; zoneSpawnCard.prefab = zonePrefab; zoneSpawnCard.directorCreditCost = 0; zoneSpawnCard.sendOverNetwork = true; zoneSpawnCard.hullSize = HullClassification.Human; zoneSpawnCard.nodeGraphType = RoR2.Navigation.MapNodeGroup.GraphType.Ground; zoneSpawnCard.requiredFlags = RoR2.Navigation.NodeFlags.None; zoneSpawnCard.forbiddenFlags = RoR2.Navigation.NodeFlags.None; zoneSpawnCard.occupyPosition = false; GenericGameEvents.OnPopulateScene += (rng) => { DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(zoneSpawnCard, new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Random }, rng)); }; ghostMaterial = LegacyResourcesAPI.Load <Material>("Materials/matGhostEffect"); soundEventDef = ScriptableObject.CreateInstance <NetworkSoundEventDef>(); soundEventDef.eventName = "MysticsItems_Play_env_treasuremap"; MysticsItemsContent.Resources.networkSoundEventDefs.Add(soundEventDef); effectPrefab = Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Treasure Map/UnearthEffect.prefab"); EffectComponent effectComponent = effectPrefab.AddComponent <EffectComponent>(); VFXAttributes vfxAttributes = effectPrefab.AddComponent <VFXAttributes>(); vfxAttributes.vfxIntensity = VFXAttributes.VFXIntensity.Medium; vfxAttributes.vfxPriority = VFXAttributes.VFXPriority.Medium; effectPrefab.AddComponent <DestroyOnTimer>().duration = 1f; ShakeEmitter shakeEmitter = effectPrefab.AddComponent <ShakeEmitter>(); shakeEmitter.shakeOnStart = true; shakeEmitter.shakeOnEnable = false; shakeEmitter.duration = 0.3f; shakeEmitter.radius = 25f; shakeEmitter.scaleShakeRadiusWithLocalScale = false; shakeEmitter.wave = new Wave { amplitude = 3f, frequency = 200f }; shakeEmitter.amplitudeTimeDecay = true; MysticsItemsContent.Resources.effectPrefabs.Add(effectPrefab); TeleporterInteraction.onTeleporterChargedGlobal += TeleporterInteraction_onTeleporterChargedGlobal; }
private static void shake(CameraRigController self, CameraState cameraState) { Vector3 vector = ShakeEmitter.ComputeTotalShakeAtPoint(cameraState.position); setshake(self, vector); }
public override void OnLoad() { base.OnLoad(); itemDef.name = "MysticsItems_ExplosivePickups"; SetItemTierWhenAvailable(ItemTier.Tier2); itemDef.tags = new ItemTag[] { ItemTag.Utility, ItemTag.OnKillEffect }; itemDef.pickupModelPrefab = PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Contraband Gunpowder/Model.prefab")); itemDef.pickupIconSprite = Main.AssetBundle.LoadAsset <Sprite>("Assets/Items/Contraband Gunpowder/Icon.png"); HopooShaderToMaterial.Standard.Apply(itemDef.pickupModelPrefab.transform.Find("мешок").Find("порох").GetComponent <MeshRenderer>().sharedMaterial); HopooShaderToMaterial.Standard.Apply(itemDef.pickupModelPrefab.transform.Find("мешок").GetComponent <MeshRenderer>().sharedMaterial); HopooShaderToMaterial.Standard.Apply(itemDef.pickupModelPrefab.transform.Find("мешок").Find("верёвка").GetComponent <MeshRenderer>().sharedMaterial); HopooShaderToMaterial.Standard.Gloss(itemDef.pickupModelPrefab.transform.Find("мешок").Find("порох").GetComponent <MeshRenderer>().sharedMaterial, 0f); HopooShaderToMaterial.Standard.Gloss(itemDef.pickupModelPrefab.transform.Find("мешок").GetComponent <MeshRenderer>().sharedMaterial, 0f); HopooShaderToMaterial.Standard.Gloss(itemDef.pickupModelPrefab.transform.Find("мешок").Find("верёвка").GetComponent <MeshRenderer>().sharedMaterial, 0.4f); itemDisplayPrefab = PrepareItemDisplayModel(PrefabAPI.InstantiateClone(itemDef.pickupModelPrefab, itemDef.pickupModelPrefab.name + "Display", false)); onSetupIDRS += () => { AddDisplayRule("CommandoBody", "Stomach", new Vector3(-0.175F, 0.066F, 0.045F), new Vector3(16.687F, 66.665F, 36.228F), new Vector3(0.042F, 0.042F, 0.042F)); AddDisplayRule("HuntressBody", "Pelvis", new Vector3(-0.12F, -0.064F, -0.052F), new Vector3(355.162F, 32.177F, 180.96F), new Vector3(0.042F, 0.042F, 0.042F)); AddDisplayRule("Bandit2Body", "Stomach", new Vector3(0.156F, 0.031F, 0.127F), new Vector3(350.191F, 244.703F, 340.178F), new Vector3(0.037F, 0.037F, 0.037F)); AddDisplayRule("ToolbotBody", "Chest", new Vector3(-0.837F, 1.169F, 3.112F), new Vector3(29.795F, 9.384F, 2.716F), new Vector3(0.489F, 0.489F, 0.489F)); AddDisplayRule("EngiBody", "Pelvis", new Vector3(-0.206F, 0.04F, -0.104F), new Vector3(4.991F, 46.464F, 181.437F), new Vector3(0.065F, 0.065F, 0.065F)); AddDisplayRule("EngiTurretBody", "Head", new Vector3(0.834F, 0.462F, 0.717F), new Vector3(33.04F, 48.09F, 359.072F), new Vector3(0.168F, 0.168F, 0.168F)); AddDisplayRule("EngiWalkerTurretBody", "Head", new Vector3(0.715F, 0.235F, 0.228F), new Vector3(22.677F, 152.024F, 24.393F), new Vector3(0.134F, 0.163F, 0.131F)); AddDisplayRule("MageBody", "Pelvis", new Vector3(-0.058F, 0F, -0.164F), new Vector3(0.366F, 347.899F, 165.881F), new Vector3(0.044F, 0.044F, 0.044F)); AddDisplayRule("MercBody", "ThighR", new Vector3(-0.077F, 0.008F, 0.041F), new Vector3(15.315F, 124.284F, 220.104F), new Vector3(0.034F, 0.034F, 0.034F)); AddDisplayRule("TreebotBody", "FlowerBase", new Vector3(-0.062F, -0.523F, -1.156F), new Vector3(41.662F, 244.258F, 1.504F), new Vector3(0.107F, 0.107F, 0.107F)); AddDisplayRule("LoaderBody", "MechBase", new Vector3(0.07F, 0.023F, 0.444F), new Vector3(7.628F, 218.893F, 342.184F), new Vector3(0.054F, 0.054F, 0.054F)); AddDisplayRule("CrocoBody", "SpineChest2", new Vector3(0.779F, 1.753F, -0.514F), new Vector3(337.83F, 226.76F, 273.311F), new Vector3(0.411F, 0.411F, 0.411F)); AddDisplayRule("CaptainBody", "Stomach", new Vector3(-0.102F, 0.12F, 0.147F), new Vector3(11.46F, 212.011F, 335.706F), new Vector3(0.053F, 0.048F, 0.053F)); AddDisplayRule("BrotherBody", "Stomach", BrotherInfection.green, new Vector3(-0.18F, 0.131F, 0.075F), new Vector3(303.36F, 82.78F, 283.641F), new Vector3(0.063F, 0.063F, 0.063F)); AddDisplayRule("ScavBody", "MuzzleEnergyCannon", new Vector3(0.586F, 3.872F, 0.073F), new Vector3(54.107F, 148.5F, 149.008F), new Vector3(0.835F, 0.858F, 0.835F)); if (SoftDependencies.SoftDependenciesCore.itemDisplaysSniper) { AddDisplayRule("SniperClassicBody", "Pelvis", new Vector3(-0.19573F, 0.1786F, -0.09573F), new Vector3(4.5648F, 55.41101F, 9.99794F), new Vector3(0.053F, 0.053F, 0.053F)); } AddDisplayRule("RailgunnerBody", "Pelvis", new Vector3(-0.15453F, 0.10747F, -0.16311F), new Vector3(359.8358F, 321.1621F, 178.6592F), new Vector3(0.05825F, 0.05825F, 0.05825F)); AddDisplayRule("VoidSurvivorBody", "Neck", new Vector3(0.08624F, 0.00251F, 0.20226F), new Vector3(23.68506F, 25.82453F, 8.87328F), new Vector3(0.062F, 0.062F, 0.062F)); }; MysticsRisky2Utils.Utils.CopyChildren(Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Contraband Gunpowder/ExplosivePack.prefab"), gunpowderPickup); gunpowderPickup.transform.localScale *= 0.33f; gunpowderPickup.layer = LayerIndex.debris.intVal; DestroyOnTimer destroyOnTimer = gunpowderPickup.AddComponent <DestroyOnTimer>(); destroyOnTimer.duration = 60f; destroyOnTimer.resetAgeOnDisable = false; BeginRapidlyActivatingAndDeactivating blink = gunpowderPickup.AddComponent <BeginRapidlyActivatingAndDeactivating>(); blink.blinkFrequency = 20f; blink.delayBeforeBeginningBlinking = destroyOnTimer.duration - 1f; blink.blinkingRootObject = gunpowderPickup.transform.Find("мешок").gameObject; Rigidbody rigidbody = gunpowderPickup.GetComponent <Rigidbody>(); VelocityRandomOnStart velocity = gunpowderPickup.AddComponent <VelocityRandomOnStart>(); velocity.minSpeed = 10f; velocity.maxSpeed = 20f; velocity.baseDirection = Vector3.up; velocity.localDirection = false; velocity.directionMode = VelocityRandomOnStart.DirectionMode.Cone; velocity.coneAngle = 15f; velocity.maxAngularSpeed = velocity.minAngularSpeed = 0f; gunpowderPickup.AddComponent <RoR2.Projectile.ProjectileNetworkTransform>(); TeamFilter teamFilter = gunpowderPickup.AddComponent <TeamFilter>(); GameObject pickupTrigger = gunpowderPickup.transform.Find("PickupTrigger").gameObject; pickupTrigger.layer = LayerIndex.pickups.intVal; pickupTrigger.AddComponent <TeamFilter>(); ExplosivePack explosivePack = pickupTrigger.AddComponent <ExplosivePack>(); explosivePack.baseObject = gunpowderPickup; explosivePack.teamFilter = teamFilter; GameObject gravitationController = gunpowderPickup.transform.Find("GravitationController").gameObject; ExplosivePackGravitate gravitatePickup = gravitationController.AddComponent <ExplosivePackGravitate>(); gravitatePickup.rigidbody = rigidbody; gravitatePickup.teamFilter = teamFilter; gravitatePickup.acceleration = 5f; gravitatePickup.maxSpeed = 40f; /* * explosionPrefab = Main.AssetBundle.LoadAsset<GameObject>("Assets/Items/Contraband Gunpowder/Explosion.prefab"); * EffectComponent effectComponent = explosionPrefab.AddComponent<EffectComponent>(); * effectComponent.applyScale = true; * effectComponent.soundName = "Play_mage_m1_impact"; * VFXAttributes vfxAttributes = explosionPrefab.AddComponent<VFXAttributes>(); * vfxAttributes.vfxPriority = VFXAttributes.VFXPriority.Medium; * vfxAttributes.vfxIntensity = VFXAttributes.VFXIntensity.Medium; * vfxAttributes.optionalLights = new Light[] * { * explosionPrefab.transform.Find("Point Light").gameObject.GetComponent<Light>() * }; * vfxAttributes.secondaryParticleSystem = new ParticleSystem[] * { * explosionPrefab.transform.Find("Big Circle").gameObject.GetComponent<ParticleSystem>(), * explosionPrefab.transform.Find("Small Circles").gameObject.GetComponent<ParticleSystem>() * }; * DestroyOnTimer destroyOnTimer1 = explosionPrefab.AddComponent<DestroyOnTimer>(); * destroyOnTimer1.duration = 2f; * ShakeEmitter shakeEmitter = explosionPrefab.AddComponent<ShakeEmitter>(); * shakeEmitter.shakeOnStart = true; * shakeEmitter.wave = new Wave * { * amplitude = 1f, * frequency = 180f, * cycleOffset = 0f * }; * shakeEmitter.duration = 0.15f; * shakeEmitter.radius = 10f; * shakeEmitter.scaleShakeRadiusWithLocalScale = true; * shakeEmitter.amplitudeTimeDecay = true; * explosionPrefab.transform.Find("Point Light").gameObject.GetComponent<Light>().gameObject.AddComponent<MysticsItemsScaleLight>(); * * AssetManager.RegisterEffect(explosionPrefab); */ explosionPrefab = PrefabAPI.InstantiateClone(Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Contraband Gunpowder/Explosion.prefab"), "MysticsItems_OmniExplosionVFXExplosivePickups", false); ConfigOptions.ConfigurableValue.CreateBool( ConfigManager.General.categoryGUID, ConfigManager.General.categoryName, ConfigManager.General.config, "Effects", "Reduce Contraband Gunpowder VFX", false, "Reduce the visual effects of Contraband Gunpowder explosions", onChanged: (newValue) => { explosionPrefab.transform.Find("Light Flash").gameObject.SetActive(!newValue); explosionPrefab.transform.Find("Sparks").gameObject.SetActive(!newValue); explosionPrefab.transform.Find("Swirls").gameObject.SetActive(!newValue); } ); VFXAttributes vfxAttributes = explosionPrefab.AddComponent <VFXAttributes>(); vfxAttributes.vfxIntensity = VFXAttributes.VFXIntensity.High; vfxAttributes.vfxPriority = VFXAttributes.VFXPriority.Always; EffectComponent effectComponent = explosionPrefab.AddComponent <EffectComponent>(); effectComponent.applyScale = true; ConfigOptions.ConfigurableValue.CreateBool( ConfigManager.General.categoryGUID, ConfigManager.General.categoryName, ConfigManager.General.config, "Effects", "Disable Contraband Gunpowder SFX", false, "Disable the sound effects of Contraband Gunpowder explosions", onChanged: (newValue) => { effectComponent.soundName = newValue ? "" : "MysticsItems_Play_item_proc_gunpowder"; } ); explosionPrefab.AddComponent <DestroyOnTimer>().duration = 2f; ShakeEmitter shakeEmitter = explosionPrefab.AddComponent <ShakeEmitter>(); shakeEmitter.duration = 0.1f; shakeEmitter.scaleShakeRadiusWithLocalScale = true; shakeEmitter.amplitudeTimeDecay = true; shakeEmitter.radius = 1.5f; shakeEmitter.shakeOnStart = true; ConfigOptions.ConfigurableValue.CreateFloat( ConfigManager.General.categoryGUID, ConfigManager.General.categoryName, ConfigManager.General.config, "Effects", "Contraband Gunpowder Screenshake", 1f, 0f, 1f, "Adjust the intensity of Contraband Gunpowder explosion screenshake", onChanged: (newValue) => { shakeEmitter.wave = new Wave { amplitude = 9f * newValue, frequency = 4f * newValue }; } ); MysticsItemsContent.Resources.effectPrefabs.Add(explosionPrefab); /* * Main.OnHitEnemy += delegate (DamageInfo damageInfo, Main.GenericCharacterInfo attackerInfo, Main.GenericCharacterInfo victimInfo) * { * if (NetworkServer.active) * { * if (attackerInfo.inventory && attackerInfo.inventory.GetItemCount(itemIndex) > 0) * { * if (Util.CheckRoll(7f, attackerInfo.master)) * { * GameObject gameObject = Object.Instantiate(gunpowderPickup, damageInfo.position, Quaternion.identity); * gameObject.GetComponent<TeamFilter>().teamIndex = attackerInfo.teamIndex; * NetworkServer.Spawn(gameObject); * } * } * } * }; */ On.RoR2.CharacterBody.HandleOnKillEffectsServer += (orig, self, damageReport) => { orig(self, damageReport); if (self.inventory && self.inventory.GetItemCount(MysticsItemsContent.Items.MysticsItems_ExplosivePickups) > 0 && self.master && Util.CheckRoll(flaskDropChance, self.master)) { GameObject gameObject = Object.Instantiate(gunpowderPickup, Util.GetCorePosition(damageReport.victim.gameObject), Quaternion.Euler(Random.onUnitSphere.normalized)); gameObject.GetComponent <TeamFilter>().teamIndex = TeamComponent.GetObjectTeam(self.gameObject); NetworkServer.Spawn(gameObject); } }; IL.RoR2.HealthPickup.OnTriggerStay += (il) => { ILCursor c = new ILCursor(il); if (c.TryGotoNext( MoveType.After, x => x.MatchLdarg(0), x => x.MatchLdfld <HealthPickup>("baseObject"), x => x.MatchCallOrCallvirt <Object>("Destroy") )) { c.Emit(OpCodes.Ldarg_0); c.Emit(OpCodes.Ldarg_1); c.EmitDelegate <System.Action <MonoBehaviour, Collider> >((pickup, collider) => { CharacterBody body = collider.GetComponent <CharacterBody>(); if (body) { Inventory inventory = body.inventory; if (inventory && inventory.GetItemCount(MysticsItemsContent.Items.MysticsItems_ExplosivePickups) > 0) { Explode(body); } } }); } }; IL.RoR2.MoneyPickup.OnTriggerStay += (il) => { ILCursor c = new ILCursor(il); if (c.TryGotoNext( MoveType.After, x => x.MatchLdarg(0), x => x.MatchLdfld <MoneyPickup>("baseObject"), x => x.MatchCallOrCallvirt <Object>("Destroy") )) { c.Emit(OpCodes.Ldarg_0); c.Emit(OpCodes.Ldarg_1); c.EmitDelegate <System.Action <MonoBehaviour, Collider> >((pickup, collider) => { CharacterBody body = collider.GetComponent <CharacterBody>(); if (body) { Inventory inventory = body.inventory; if (inventory && inventory.GetItemCount(MysticsItemsContent.Items.MysticsItems_ExplosivePickups) > 0) { Explode(body); } } }); } }; IL.RoR2.BuffPickup.OnTriggerStay += (il) => { ILCursor c = new ILCursor(il); if (c.TryGotoNext( MoveType.After, x => x.MatchLdarg(0), x => x.MatchLdfld <BuffPickup>("baseObject"), x => x.MatchCallOrCallvirt <Object>("Destroy") )) { c.Emit(OpCodes.Ldarg_0); c.Emit(OpCodes.Ldarg_1); c.EmitDelegate <System.Action <MonoBehaviour, Collider> >((pickup, collider) => { CharacterBody body = collider.GetComponent <CharacterBody>(); if (body) { Inventory inventory = body.inventory; if (inventory && inventory.GetItemCount(MysticsItemsContent.Items.MysticsItems_ExplosivePickups) > 0) { Explode(body); } } }); } }; IL.RoR2.AmmoPickup.OnTriggerStay += (il) => { ILCursor c = new ILCursor(il); if (c.TryGotoNext( MoveType.After, x => x.MatchLdarg(0), x => x.MatchLdfld <AmmoPickup>("baseObject"), x => x.MatchCallOrCallvirt <Object>("Destroy") )) { c.Emit(OpCodes.Ldarg_0); c.Emit(OpCodes.Ldarg_1); c.EmitDelegate <System.Action <MonoBehaviour, Collider> >((pickup, collider) => { CharacterBody body = collider.GetComponent <CharacterBody>(); if (body) { Inventory inventory = body.inventory; if (inventory && inventory.GetItemCount(MysticsItemsContent.Items.MysticsItems_ExplosivePickups) > 0) { Explode(body); } } }); } }; }
public override void OnLoad() { equipmentDef.name = "MysticsItems_TuningFork"; ConfigManager.Balance.CreateEquipmentCooldownOption(equipmentDef, "Equipment: Ratio Equalizer", 45f); equipmentDef.canDrop = true; ConfigManager.Balance.CreateEquipmentEnigmaCompatibleOption(equipmentDef, "Equipment: Ratio Equalizer", true); ConfigManager.Balance.CreateEquipmentCanBeRandomlyTriggeredOption(equipmentDef, "Equipment: Ratio Equalizer", false); equipmentDef.isLunar = true; equipmentDef.colorIndex = ColorCatalog.ColorIndex.LunarItem; equipmentDef.pickupModelPrefab = PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/Tuning Fork/Model.prefab")); equipmentDef.pickupIconSprite = Main.AssetBundle.LoadAsset <Sprite>("Assets/Equipment/Tuning Fork/Icon.png"); itemDisplayPrefab = PrepareItemDisplayModel(PrefabAPI.InstantiateClone(equipmentDef.pickupModelPrefab, equipmentDef.pickupModelPrefab.name + "Display", false)); equipmentDef.pickupModelPrefab.transform.Find("mdlTuningFork").Rotate(new Vector3(0f, 0f, -45f), Space.Self); onSetupIDRS += () => { AddDisplayRule("CommandoBody", "Chest", new Vector3(-0.035F, 0.196F, -0.208F), new Vector3(341.98F, 196.319F, 18.721F), new Vector3(0.042F, 0.042F, 0.042F)); AddDisplayRule("HuntressBody", "Head", new Vector3(0.001F, 0.253F, -0.112F), new Vector3(303.972F, 359.427F, 0.457F), new Vector3(0.053F, 0.023F, 0.052F)); AddDisplayRule("Bandit2Body", "MuzzleShotgun", new Vector3(0.048F, -0.002F, -0.306F), new Vector3(3.659F, 270F, 270F), new Vector3(0.047F, 0.047F, 0.047F)); AddDisplayRule("ToolbotBody", "Chest", new Vector3(-2.568F, 2.244F, -0.393F), new Vector3(0F, 90F, 128.784F), new Vector3(0.404F, 0.404F, 0.404F)); AddDisplayRule("EngiBody", "Chest", new Vector3(0.074F, 0.278F, -0.256F), new Vector3(10.736F, 0F, 0F), new Vector3(0.047F, 0.047F, 0.047F)); AddDisplayRule("MageBody", "HandL", new Vector3(-0.018F, -0.007F, 0.069F), new Vector3(348.97F, 0F, 0F), new Vector3(0.044F, 0.044F, 0.044F)); AddDisplayRule("MageBody", "HandR", new Vector3(-0.052F, 0F, -0.059F), new Vector3(2.7F, 32.085F, 0F), new Vector3(0.044F, 0.044F, 0.044F)); AddDisplayRule("MercBody", "HandL", new Vector3(-0.202F, 0.132F, -0.07F), new Vector3(282.883F, 156.523F, 272.905F), new Vector3(0.041F, 0.124F, 0.041F)); AddDisplayRule("TreebotBody", "WeaponPlatform", new Vector3(0F, -0.168F, 0.421F), new Vector3(0F, 0F, 0F), new Vector3(0.146F, 0.087F, 0.146F)); AddDisplayRule("LoaderBody", "MechHandR", new Vector3(0.087F, 0.245F, 0F), new Vector3(0F, 0F, 269.477F), new Vector3(0.076F, 0.076F, 0.076F)); AddDisplayRule("CrocoBody", "SpineChest3", new Vector3(-0.496F, 0.632F, 1.029F), new Vector3(76.142F, 328.553F, 189.334F), new Vector3(0.361F, 0.361F, 0.361F)); AddDisplayRule("CaptainBody", "HandL", new Vector3(0F, 0.197F, -0.042F), new Vector3(0F, 0F, 0F), new Vector3(0.041F, 0.041F, 0.041F)); AddDisplayRule("ScavBody", "MuzzleEnergyCannon", new Vector3(0F, -4.749F, 0F), new Vector3(90F, 0F, 0F), new Vector3(1.363F, 1.363F, 1.363F)); AddDisplayRule("ScavBody", "MuzzleEnergyCannon", new Vector3(3.396F, 3.443F, -0.001F), new Vector3(40.988F, 270F, 270F), new Vector3(1.363F, 1.363F, 1.363F)); AddDisplayRule("ScavBody", "MuzzleEnergyCannon", new Vector3(-3.396F, 3.443F, -0.001F), new Vector3(36.034F, 90F, 90F), new Vector3(1.363F, 1.363F, 1.363F)); AddDisplayRule("EquipmentDroneBody", "GunBarrelBase", new Vector3(0F, 0F, 1.069F), new Vector3(52.789F, 0F, 0F), new Vector3(0.267F, 0.267F, 0.267F)); if (SoftDependencies.SoftDependenciesCore.itemDisplaysSniper) { AddDisplayRule("SniperClassicBody", "Muzzle", new Vector3(-1.3198F, 0.0289F, -0.04268F), new Vector3(0F, 180F, 91.41144F), new Vector3(0.20742F, 0.20742F, 0.20742F)); } AddDisplayRule("RailgunnerBody", "GunBarrel", new Vector3(0F, 0.44626F, -0.00003F), new Vector3(0F, 0F, 0F), new Vector3(0.09836F, 0.09836F, 0.09836F)); AddDisplayRule("VoidSurvivorBody", "Chest", new Vector3(-0.23241F, 0.28735F, -0.12019F), new Vector3(340.9082F, 290.4134F, 53.57893F), new Vector3(0.06483F, 0.06483F, 0.06483F)); }; visualEffect = PrefabAPI.InstantiateClone(new GameObject(), "MysticsItems_TuningForkEffect", false); float time = 1.2f; EffectComponent effectComponent = visualEffect.AddComponent <EffectComponent>(); effectComponent.parentToReferencedTransform = false; effectComponent.applyScale = true; effectComponent.soundName = "Play_item_use_tuningfork"; VFXAttributes vfxAttributes = visualEffect.AddComponent <VFXAttributes>(); vfxAttributes.vfxPriority = VFXAttributes.VFXPriority.Always; vfxAttributes.vfxIntensity = VFXAttributes.VFXIntensity.High; visualEffect.AddComponent <DestroyOnTimer>().duration = time; ShakeEmitter shakeEmitter = visualEffect.AddComponent <ShakeEmitter>(); shakeEmitter.shakeOnStart = true; shakeEmitter.wave = new Wave { frequency = 2f, amplitude = 0.1f }; shakeEmitter.duration = time; shakeEmitter.radius = radius.Value; shakeEmitter.amplitudeTimeDecay = true; GameObject ppHolder = PrefabAPI.InstantiateClone(new GameObject(), "PP", false); ppHolder.AddComponent <MysticsItemsTuningForkPPController>().time = time; SphereCollider ppSphere = ppHolder.AddComponent <SphereCollider>(); ppSphere.radius = radius.Value * 0.3f; ppSphere.isTrigger = true; ppHolder.layer = LayerIndex.postProcess.intVal; PostProcessVolume pp = ppHolder.AddComponent <PostProcessVolume>(); pp.blendDistance = radius.Value * 0.7f; pp.isGlobal = false; pp.weight = 0f; pp.priority = 4; PostProcessProfile ppProfile = ScriptableObject.CreateInstance <PostProcessProfile>(); ppProfile.name = "ppLocalTuningFork"; LensDistortion lensDistortion = ppProfile.AddSettings <LensDistortion>(); lensDistortion.SetAllOverridesTo(true); lensDistortion.intensity.value = -50f; lensDistortion.scale.value = 1f; pp.sharedProfile = ppProfile; ppHolder.transform.SetParent(visualEffect.transform); GameObject radiusIndicator = PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load <GameObject>("Prefabs/NetworkedObjects/Teleporters/Teleporter1").transform.Find("TeleporterBaseMesh").Find("BuiltInEffects").Find("ChargingEffect").Find("RadiusScaler").Find("ClearAreaIndicator").gameObject, "RadiusIndicator", false); radiusIndicator.AddComponent <MysticsItemsTuningForkRadiusIndicatorController>(); MeshRenderer meshRenderer = radiusIndicator.GetComponent <MeshRenderer>(); meshRenderer.material.SetFloat("_RimPower", 1.2f); meshRenderer.material.SetTexture("_RemapTex", Main.AssetBundle.LoadAsset <Texture2D>("Assets/Equipment/Tuning Fork/texRampTuningFork.png")); for (int i = 0; i < 3; i++) { GameObject radiusIndicator2 = PrefabAPI.InstantiateClone(radiusIndicator, "RadiusIndicator" + (i + 1).ToString(), false); radiusIndicator2.GetComponent <MysticsItemsTuningForkRadiusIndicatorController>().delay = 0.2f * i; radiusIndicator2.GetComponent <MysticsItemsTuningForkRadiusIndicatorController>().time = time - 0.2f * i; radiusIndicator2.transform.SetParent(visualEffect.transform); } MysticsItemsContent.Resources.effectPrefabs.Add(visualEffect); }
public override void OnLoad() { equipmentDef.name = "MysticsItems_SirenPole"; ConfigManager.Balance.CreateEquipmentCooldownOption(equipmentDef, "Equipment: Warning System", 90f); equipmentDef.canDrop = true; ConfigManager.Balance.CreateEquipmentEnigmaCompatibleOption(equipmentDef, "Equipment: Warning System", false); ConfigManager.Balance.CreateEquipmentCanBeRandomlyTriggeredOption(equipmentDef, "Equipment: Warning System", false); equipmentDef.pickupModelPrefab = PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/Siren Pole/Model.prefab")); equipmentDef.pickupIconSprite = Main.AssetBundle.LoadAsset <Sprite>("Assets/Equipment/Siren Pole/Icon.png"); foreach (var mat in equipmentDef.pickupModelPrefab.GetComponentInChildren <Renderer>().sharedMaterials) { HopooShaderToMaterial.Standard.Apply(mat); HopooShaderToMaterial.Standard.Gloss(mat); } itemDisplayPrefab = PrepareItemDisplayModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/Siren Pole/ItemDisplayModel.prefab")); onSetupIDRS += () => { AddDisplayRule("CommandoBody", "Chest", new Vector3(0.17606F, 0.10938F, -0.13135F), new Vector3(0.29792F, 101.7337F, 14.83983F), new Vector3(0.07862F, 0.07862F, 0.07862F)); AddDisplayRule("HuntressBody", "Head", new Vector3(0.09063F, 0.20626F, -0.04851F), new Vector3(305F, 0F, 0F), new Vector3(0.019F, 0.019F, 0.019F)); AddDisplayRule("HuntressBody", "Head", new Vector3(-0.09086F, 0.20552F, -0.04818F), new Vector3(305F, 0F, 0F), new Vector3(0.019F, 0.019F, 0.019F)); AddDisplayRule("Bandit2Body", "Chest", new Vector3(-0.14208F, 0.31664F, -0.2016F), new Vector3(41.46172F, 268.9803F, 180F), new Vector3(0.0478F, 0.0478F, 0.0478F)); AddDisplayRule("ToolbotBody", "Chest", new Vector3(-1.82578F, 2.33771F, -1.55785F), new Vector3(0F, 36.0168F, 0F), new Vector3(0.349F, 0.349F, 0.349F)); AddDisplayRule("EngiBody", "Chest", new Vector3(-0.08444F, 0.34718F, -0.26302F), new Vector3(10.10721F, 23.50117F, 4.36377F), new Vector3(0.047F, 0.047F, 0.047F)); AddDisplayRule("MageBody", "Chest", new Vector3(0.1608F, 0.06538F, -0.13697F), new Vector3(8.71729F, 3.87203F, 0.58771F), new Vector3(0.05396F, 0.05396F, 0.05396F)); AddDisplayRule("MercBody", "HandR", new Vector3(0.17621F, 0.22065F, 0F), new Vector3(0F, 0F, 101.9694F), new Vector3(0.08846F, 0.08846F, 0.08846F)); AddDisplayRule("TreebotBody", "PlatformBase", new Vector3(0.57548F, 1.38046F, -0.57101F), new Vector3(0F, 33.34396F, 0F), new Vector3(0.16617F, 0.16617F, 0.16617F)); AddDisplayRule("LoaderBody", "MechHandL", new Vector3(0.31421F, 0.28839F, 0.14368F), new Vector3(9.63979F, 331.6965F, 84.84715F), new Vector3(0.12826F, 0.12826F, 0.12703F)); AddDisplayRule("CrocoBody", "Head", new Vector3(-4.57107F, 4.06093F, 0.00616F), new Vector3(283.0015F, 97.09286F, 178.9819F), new Vector3(1.08323F, 1.08323F, 1.08323F)); AddDisplayRule("CaptainBody", "Chest", new Vector3(0.26173F, 0.18196F, 0.04468F), new Vector3(0F, 304.076F, 0F), new Vector3(0.09072F, 0.09072F, 0.09072F)); AddDisplayRule("ScavBody", "Backpack", new Vector3(0.93854F, 9.81353F, 0.67947F), new Vector3(23.62728F, 47.52236F, 14.61215F), new Vector3(1.66171F, 1.66171F, 1.66171F)); AddDisplayRule("EquipmentDroneBody", "GunBarrelBase", new Vector3(0.00002F, -0.72671F, 0.39234F), new Vector3(47.37738F, -0.00013F, 0.0009F), new Vector3(0.42601F, 0.42601F, 0.42601F)); if (SoftDependencies.SoftDependenciesCore.itemDisplaysSniper) { AddDisplayRule("SniperClassicBody", "AntennaL", new Vector3(-0.00958F, 0.16798F, 0.00024F), new Vector3(0F, 91.3699F, 0F), new Vector3(0.0678F, 0.0678F, 0.0678F)); } AddDisplayRule("RailgunnerBody", "Backpack", new Vector3(-0.19222F, -0.15375F, 0.0742F), new Vector3(0F, 90F, 0F), new Vector3(0.09801F, 0.09801F, 0.09801F)); AddDisplayRule("VoidSurvivorBody", "Head", new Vector3(0.47319F, 0.1069F, 0.00462F), new Vector3(-0.00001F, 180F, 259.7787F), new Vector3(0.08856F, 0.09671F, 0.08856F)); }; MysticsItemsSirenPoleController sirenPoleController = inWorldPrefab.AddComponent <MysticsItemsSirenPoleController>(); sirenPoleController.poleTransform = inWorldPrefab.transform.Find("PoleTransform"); HoldoutZoneController holdoutZoneController = inWorldPrefab.AddComponent <HoldoutZoneController>(); holdoutZoneController.baseRadius = baseRadius.Value; holdoutZoneController.baseChargeDuration = chargeTime.Value; holdoutZoneController.radiusSmoothTime = 0.3f; holdoutZoneController.radiusIndicator = inWorldPrefab.transform.Find("RadiusIndicator").gameObject.GetComponent <Renderer>(); holdoutZoneController.inBoundsObjectiveToken = "OBJECTIVE_MYSTICSITEMS_CHARGE_SIRENPOLE"; holdoutZoneController.outOfBoundsObjectiveToken = "OBJECTIVE_MYSTICSITEMS_CHARGE_SIRENPOLE"; holdoutZoneController.applyHealingNova = true; holdoutZoneController.applyFocusConvergence = true; holdoutZoneController.playerCountScaling = 0f; holdoutZoneController.dischargeRate = 0f; holdoutZoneController.enabled = false; sirenPoleController.holdoutZoneController = holdoutZoneController; On.RoR2.HoldoutZoneController.ChargeHoldoutZoneObjectiveTracker.ShouldBeFlashing += (orig, self) => { if (self.sourceDescriptor.master) { HoldoutZoneController holdoutZoneController2 = (HoldoutZoneController)self.sourceDescriptor.source; if (holdoutZoneController2 && holdoutZoneController.gameObject.GetComponent <MysticsItemsSirenPoleController>()) { return(false); } } return(orig(self)); }; CombatDirector phaseCombatDirector = inWorldPrefab.AddComponent <CombatDirector>(); phaseCombatDirector.customName = "WeakMonsters"; phaseCombatDirector.expRewardCoefficient = 0.1f; phaseCombatDirector.minSeriesSpawnInterval = 0.5f; phaseCombatDirector.maxSeriesSpawnInterval = 0.5f; phaseCombatDirector.minRerollSpawnInterval = 2f; phaseCombatDirector.maxRerollSpawnInterval = 4f; phaseCombatDirector.moneyWaveIntervals = new RangeFloat[] { }; phaseCombatDirector.teamIndex = TeamIndex.Monster; phaseCombatDirector.creditMultiplier = 1f; phaseCombatDirector.spawnDistanceMultiplier = 1f; phaseCombatDirector.shouldSpawnOneWave = true; phaseCombatDirector.targetPlayers = false; phaseCombatDirector.skipSpawnIfTooCheap = false; phaseCombatDirector.resetMonsterCardIfFailed = true; phaseCombatDirector.maximumNumberToSpawnBeforeSkipping = 5; phaseCombatDirector.eliteBias = 1f; phaseCombatDirector.ignoreTeamSizeLimit = true; phaseCombatDirector.fallBackToStageMonsterCards = false; phaseCombatDirector.monsterSpawnTimer = 0f; phaseCombatDirector.enabled = false; sirenPoleController.waveCombatDirector = phaseCombatDirector; TeleporterInteraction teleporterInteraction = inWorldPrefab.AddComponent <TeleporterInteraction>(); teleporterInteraction.enabled = false; ShakeEmitter shakeEmitter = inWorldPrefab.AddComponent <ShakeEmitter>(); shakeEmitter.duration = 0.2f; shakeEmitter.amplitudeTimeDecay = true; shakeEmitter.radius = 20f; shakeEmitter.shakeOnStart = true; shakeEmitter.shakeOnEnable = false; shakeEmitter.wave.frequency = 8f; shakeEmitter.wave.amplitude = 5f; shakeEmitter = inWorldPrefab.AddComponent <ShakeEmitter>(); shakeEmitter.duration = 0.2f; shakeEmitter.amplitudeTimeDecay = true; shakeEmitter.radius = 60f; shakeEmitter.shakeOnStart = false; shakeEmitter.shakeOnEnable = true; shakeEmitter.wave.frequency = 8f; shakeEmitter.wave.amplitude = 5f; sirenPoleController.waveShakeEmitter = shakeEmitter; inWorldPrefab.AddComponent <GenericDisplayNameProvider>().displayToken = "MYSTICSITEMS_SIRENPOLE_NAME"; inWorldPrefab.AddComponent <ProxyInteraction>(); inWorldPrefab.transform.Find("PoleTransform/InteractionCollider").gameObject.AddComponent <EntityLocator>().entity = inWorldPrefab; onTeleporterBeginChargingGlobalHook = new ILHook( typeof(MysticsItemsSirenPoleController).GetMethod("RunOnTeleporterBeginChargingGlobal"), il => { ILCursor c = new ILCursor(il); c.Emit(OpCodes.Ldsfld, typeof(TeleporterInteraction).GetField("onTeleporterBeginChargingGlobal", Main.bindingFlagAll)); c.Emit(OpCodes.Ldarg, 1); c.Emit(OpCodes.Callvirt, typeof(System.Action <TeleporterInteraction>).GetMethodCached("Invoke")); } ); onTeleporterChargedGlobalHook = new ILHook( typeof(MysticsItemsSirenPoleController).GetMethod("RunOnTeleporterChargedGlobal"), il => { ILCursor c = new ILCursor(il); c.Emit(OpCodes.Ldsfld, typeof(TeleporterInteraction).GetField("onTeleporterChargedGlobal", Main.bindingFlagAll)); c.Emit(OpCodes.Ldarg, 1); c.Emit(OpCodes.Callvirt, typeof(System.Action <TeleporterInteraction>).GetMethodCached("Invoke")); } ); On.RoR2.TeleporterInteraction.Awake += (orig, self) => { if (!self.GetComponent <MysticsItemsSirenPoleController>()) { orig(self); } }; On.RoR2.TeleporterInteraction.IdleToChargingState.OnEnter += (orig, self) => { MysticsItemsSirenPoleController.ForceEnd(); orig(self); }; On.RoR2.Language.GetLocalizedStringByToken += Language_GetLocalizedStringByToken; }