private void CharacterMaster_TransformBody(On.RoR2.CharacterMaster.orig_TransformBody orig, RoR2.CharacterMaster self, string bodyName) { var baseAI = self.GetComponent <BaseAI>(); if (baseAI) { //Chat.AddMessage($"baseAI found"); var masterPrefab = MasterCatalog.FindMasterPrefab(bodyName); if (masterPrefab) { //Chat.AddMessage($"1"); ReplaceSkillDrivers(self, baseAI, masterPrefab); } if (!masterPrefab) { var bodyPrefab = BodyCatalog.FindBodyPrefab(bodyName); if (bodyPrefab) { var masterIndex = MasterCatalog.FindAiMasterIndexForBody(bodyPrefab.GetComponent <CharacterBody>().bodyIndex); masterPrefab = MasterCatalog.GetMasterPrefab(masterIndex); if (masterPrefab) { //Chat.AddMessage($"2"); ReplaceSkillDrivers(self, baseAI, masterPrefab); } } } } orig(self, bodyName); }
public void LoadMinion(CharacterMaster playerMaster) { var masterPrefab = MasterCatalog.GetMasterPrefab((MasterCatalog.MasterIndex)masterIndex); var minionGameObject = UnityEngine.Object.Instantiate(masterPrefab); CharacterMaster minionMaster = minionGameObject.GetComponent <CharacterMaster>(); minionMaster.teamIndex = TeamIndex.Player; //MinionOwnership var newOwnerMaster = playerMaster; if (newOwnerMaster.minionOwnership.ownerMaster != null) { newOwnerMaster = newOwnerMaster.minionOwnership.ownerMaster; } minionMaster.minionOwnership.SetOwner(newOwnerMaster); //AIOwnership var aiOwnership = minionGameObject.GetComponent <AIOwnership>(); aiOwnership.ownerMaster = playerMaster; BaseAI baseAI = minionGameObject.GetComponent <BaseAI>(); baseAI.leader.gameObject = playerMaster.gameObject; NetworkServer.Spawn(minionGameObject); inventory.LoadInventory(minionMaster); }
private static void CreateEclipseDoppelganger(CharacterMaster master, Xoroshiro128Plus rng) { var card = DoppelgangerSpawnCard.FromMaster(master); if (card is null) { return; } if (card.prefab is null) { card.prefab = MasterCatalog.GetMasterPrefab(defaultMasterIndex); } Transform spawnOnTarget; DirectorCore.MonsterSpawnDistance input; if (TeleporterInteraction.instance) { spawnOnTarget = TeleporterInteraction.instance.transform; input = DirectorCore.MonsterSpawnDistance.Close; } else { spawnOnTarget = master.GetBody().coreTransform; input = DirectorCore.MonsterSpawnDistance.Far; } DirectorPlacementRule directorPlacementRule = new DirectorPlacementRule { spawnOnTarget = spawnOnTarget, placementMode = DirectorPlacementRule.PlacementMode.NearestNode }; DirectorCore.GetMonsterSpawnDistance(input, out directorPlacementRule.minDistance, out directorPlacementRule.maxDistance); DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest(card, directorPlacementRule, rng); directorSpawnRequest.teamIndexOverride = new TeamIndex?(TeamIndex.Monster); directorSpawnRequest.ignoreTeamMemberLimit = true; CombatSquad squad = null; DirectorSpawnRequest directorSpawnRequest2 = directorSpawnRequest; directorSpawnRequest2.onSpawnedServer = DelegateHelper.Combine(directorSpawnRequest2.onSpawnedServer, (res) => { if (squad is null) { squad = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/Encounters/ShadowCloneEncounter")).GetComponent <CombatSquad>(); } squad.AddMember(res.spawnedInstance.GetComponent <CharacterMaster>()); }); DirectorCore.instance.TrySpawnObject(directorSpawnRequest); if (squad is not null) { NetworkServer.Spawn(squad.gameObject); } UnityEngine.Object.Destroy(card); }
////// Hooks ////// private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { orig(self, damageInfo, victim); if (NetworkServer.active && damageInfo != null && damageInfo.attacker) { var count = GetCount(damageInfo.attacker.GetComponent <CharacterBody>()); var victimBody = victim.GetComponent <CharacterBody>(); if (count > 0 && damageInfo.attacker != victim && victimBody && !victimBody.gameObject.name.Contains("Brother") && !victimBody.gameObject.name.Contains("VoidRaidCrab") && !victimBody.gameObject.name.Contains("ScavLunar") && victimBody.master && victimBody.master.inventory && victimBody.master.inventory.GetItemCount(gupDebuff) < count) { var sricd = damageInfo.attacker.GetComponent <ShrinkRayICDComponent>(); if (!sricd) { sricd = damageInfo.attacker.AddComponent <ShrinkRayICDComponent>(); } if (Time.fixedTime - sricd.lastHit > icd) { sricd.lastHit = Time.fixedTime; victimBody.master.inventory.GiveItem(gupDebuff); EffectManager.SpawnEffect(EntityStates.Gup.BaseSplitDeath.deathEffectPrefab, new EffectData { origin = victim.GetComponent <CharacterBody>().corePosition, scale = 10f }, true); var masterPrefab = MasterCatalog.GetMasterPrefab(victimBody.master.masterIndex); currentSplitIsGupRay = true; new BodySplitter { body = victimBody, masterSummon = { masterPrefab = masterPrefab }, count = splitCount, splinterInitialVelocityLocal = new Vector3(0f, 20f, 10f), minSpawnCircleRadius = 3f, moneyMultiplier = 1f / (float)splitCount }.Perform(); currentSplitIsGupRay = false; if (victimBody.master) { victimBody.master.TrueKill(); } GameObject.Destroy(victimBody.gameObject); } } } }
public void OnReceived() { if (_body && _body.master) { var dispMaster = new MasterSummon { masterPrefab = MasterCatalog.GetMasterPrefab(_masterIndex), position = _pos, rotation = _rot, summonerBodyObject = _body.gameObject, ignoreTeamMemberLimit = true, inventoryToCopy = _body.inventory }.Perform(); Deployable deployable = dispMaster.gameObject.AddComponent <Deployable>(); deployable.onUndeploy = new UnityEvent(); deployable.onUndeploy.AddListener(new UnityAction(dispMaster.TrueKill)); _body.master.AddDeployable(deployable, EngiUtilitySpeedispenser.instance.deployableSlot); } }
public override void OnEnter() { base.OnEnter(); base.characterBody.isSprinting = true; this.dashVector = -base.characterDirection.forward; Util.PlaySound("HenryStinger", base.gameObject); base.PlayAnimation("Gesture, Override", "BufferEmpty"); base.gameObject.layer = LayerIndex.fakeActor.intVal; base.characterMotor.Motor.RebuildCollidableLayers(); if (NetworkServer.active) { //base.characterBody.AddBuff(BuffIndex.HiddenInvincibility); CharacterMaster newCloneMaster = new MasterSummon { masterPrefab = MasterCatalog.GetMasterPrefab(MasterCatalog.FindMasterIndex("MrGreenCloneMaster")), position = base.transform.position, rotation = base.modelLocator.modelBaseTransform.rotation, summonerBodyObject = base.gameObject, ignoreTeamMemberLimit = true }.Perform(); Inventory inventory = newCloneMaster.inventory; inventory.CopyItemsFrom(base.characterBody.master.inventory); /*inventory.ResetItem(ItemIndex.WardOnLevel); * inventory.ResetItem(ItemIndex.BeetleGland); * inventory.ResetItem(ItemIndex.CrippleWardOnLevel); * inventory.ResetItem(ItemIndex.TPHealingNova); * inventory.ResetItem(ItemIndex.FocusConvergence); * inventory.ResetItem(ItemIndex.TitanGoldDuringTP);*/ var delayedDamage = newCloneMaster.gameObject.AddComponent <Modules.Components.DelayedDamageOnSpawn>(); delayedDamage.attacker = this.attacker; delayedDamage.damage = this.storedDamage; delayedDamage.tracker = this.tracker; } }
//Loads minion after scene was populated //so that minion's AI won't throw exceptions because it can't navigate internal void LoadMinion(CharacterMaster playerMaster) { SceneDirector.onPostPopulateSceneServer += SpawnMinion; void SpawnMinion(SceneDirector obj) { SceneDirector.onPostPopulateSceneServer -= SpawnMinion; var masterPrefab = MasterCatalog.GetMasterPrefab((MasterCatalog.MasterIndex)masterIndex); var minionGameObject = Object.Instantiate(masterPrefab); CharacterMaster minionMaster = minionGameObject.GetComponent <CharacterMaster>(); minionMaster.teamIndex = TeamIndex.Player; //MinionOwnership var newOwnerMaster = playerMaster; if (newOwnerMaster.minionOwnership.ownerMaster != null) { newOwnerMaster = newOwnerMaster.minionOwnership.ownerMaster; } minionMaster.minionOwnership.SetOwner(newOwnerMaster); //AIOwnership var aiOwnership = minionGameObject.GetComponent <AIOwnership>(); aiOwnership.ownerMaster = playerMaster; BaseAI baseAI = minionGameObject.GetComponent <BaseAI>(); baseAI.leader.gameObject = playerMaster.gameObject; NetworkServer.Spawn(minionGameObject); inventory.LoadInventory(minionMaster.inventory); } }
private bool PerformEquipmentActionInternal(EquipmentSlot slot) { var candidates = CharacterMaster.readOnlyInstancesList.Where(x => x.IsDeadAndOutOfLivesServer() && x.teamIndex == TeamIndex.Player); GameObject obj; GameObject podPrefab = LegacyResourcesAPI.Load <GameObject>("Prefabs/NetworkedObjects/RoboCratePod"); var nodeGraph = SceneInfo.instance.GetNodeGraph(MapNodeGroup.GraphType.Ground); var nodeInd = nodeGraph.FindClosestNodeWithFlagConditions(slot.transform.position, HullClassification.Human, NodeFlags.None, NodeFlags.None, false); Vector3 nodePos = slot.transform.position; Quaternion nodeRot = Quaternion.identity; if (nodeGraph.GetNodePosition(nodeInd, out nodePos)) { var targPos = slot.transform.position; targPos.y = nodePos.y; nodeRot = Util.QuaternionSafeLookRotation(nodePos - targPos); } if (candidates.Count() > 0) { var which = rng.NextElementUniform(candidates.ToArray()); var newBody = which.Respawn(nodePos, nodeRot); if (!newBody) { return(false); } obj = newBody.gameObject; string rezTargetName = Language.GetString(newBody.baseNameToken); var newBodyUser = Util.LookUpBodyNetworkUser(newBody); if (newBodyUser) { rezTargetName = newBodyUser.userName; } var rezzerName = slot.characterBody ? Language.GetString(slot.characterBody.baseNameToken) : "Someone"; var rezzerUser = Util.LookUpBodyNetworkUser(slot.characterBody); if (rezzerUser) { rezzerName = rezzerUser.userName; } NetUtil.ServerSendGlobalChatMsg($"{rezzerName} called down a clone of {rezTargetName}!"); } else { var whichName = rng.NextElementUniform(droneMasterPrefabNames.ToArray()); var whichIndex = MasterCatalog.FindMasterIndex(whichName); var which = MasterCatalog.GetMasterPrefab(whichIndex); if (!which) { return(false); } var summon = new MasterSummon { masterPrefab = which, position = nodePos, rotation = nodeRot, summonerBodyObject = slot.characterBody ? slot.characterBody.gameObject : null, ignoreTeamMemberLimit = true, useAmbientLevel = new bool?(true) }.Perform(); if (!summon) { return(false); } obj = summon.GetBodyObject(); if (!obj) { return(false); } if (obj.name == "EquipmentDroneBody(Clone)") { var droneInv = obj.GetComponent <Inventory>(); if (droneInv) { var randomEqp = rng.NextElementUniform(RoR2.Artifacts.EnigmaArtifactManager.validEquipment); droneInv.SetEquipment(new EquipmentState(randomEqp, Run.FixedTimeStamp.negativeInfinity, 1), 0); } } else if (which == ItemDrone.instance.itemDroneMasterPrefab) { var wardPersist = summon.GetComponent <ItemDroneWardPersist>(); var drops = LegacyResourcesAPI.Load <BasicPickupDropTable>("DropTables/dtSmallChest"); var drop = drops.GenerateDrop(rng); var pdef = PickupCatalog.GetPickupDef(drop); if (wardPersist && pdef != null && pdef.itemIndex != ItemIndex.None) { int remCount = 1; if (pdef.itemTier == ItemTier.Tier2 || pdef.itemTier == ItemTier.VoidTier2) { remCount = 3; } if (pdef.itemTier == ItemTier.Tier1 || pdef.itemTier == ItemTier.VoidTier1) { remCount = 5; } wardPersist.index = pdef.itemIndex; wardPersist.count = remCount; } } } if (!obj) { return(false); } var objBody = obj.GetComponent <CharacterBody>(); var podObj = GameObject.Instantiate(podPrefab, nodePos, nodeRot); var podSeat = podObj.GetComponent <VehicleSeat>(); if (podSeat) { podSeat.AssignPassenger(obj); } else { TinkersSatchelPlugin._logger.LogError($"Pod {podObj} spawned for revived prefab {obj} has no seat!"); } NetworkServer.Spawn(podObj); objBody.SetBodyStateToPreferredInitialState(); slot.inventory.SetEquipment(new EquipmentState(EquipmentIndex.None, Run.FixedTimeStamp.now + cooldown, 0), (uint)slot.inventory.activeEquipmentSlot); return(true); }