public static void SetupDeployableSlots()
 {
     deployableSlot_Scanner   = DeployableAPI.RegisterDeployableSlot(GetScannerDeployableSameSlotLimit);
     deployableSlot_Gateway   = DeployableAPI.RegisterDeployableSlot(GetGatewayDeployableSameSlotLimit);
     deployableSlot_Saw       = DeployableAPI.RegisterDeployableSlot(GetSawDeployableSameSlotLimit);
     deployableSlot_Blackhole = DeployableAPI.RegisterDeployableSlot(GetBlackholeDeployableSameSlotLimit);
 }
        private bool CanDeploy(EquipmentSlot equipmentSlot, DeployableSlot deployableSlot)
        {
            CharacterMaster master = equipmentSlot.characterBody.master;

            if (!master)
            {
                return(false);
            }
            if (master.GetDeployableCount(deployableSlot) >= master.GetDeployableSameSlotLimit(deployableSlot))
            {
                return(false);
            }
            return(true);
        }
Esempio n. 3
0
 //Method to give turrets the starting bonus of its owner
 private void CharacterMaster_AddDeployable(On.RoR2.CharacterMaster.orig_AddDeployable orig,
                                            CharacterMaster self,
                                            Deployable deployable,
                                            DeployableSlot slot)
 {
     orig(self, deployable, slot);
     if (TurretReceivesBonusFromEngineer.Value &&
         slot == DeployableSlot.EngiTurret)
     {
         var ownerMasterBonus = deployable.ownerMaster.inventory.infusionBonus;
         if (ownerMasterBonus > 0)
         {
             var turretMaster = deployable.GetComponent <CharacterMaster>();
             turretMaster.inventory.AddInfusionBonus(ownerMasterBonus);
         }
     }
 }
        public void AddDeployable(Deployable deployable, DeployableSlot slot)
        {
            if (!NetworkServer.active)
            {
                Debug.LogWarning("[Server] function 'System.Void RoR2.CharacterMaster::AddDeployable(RoR2.Deployable,RoR2.DeployableSlot)' called on client");
                return;
            }
            if (deployable.ownerMaster)
            {
                Debug.LogErrorFormat("Attempted to add deployable {0} which already belongs to master {1} to master {2}.", new object[]
                {
                    deployable.gameObject,
                    deployable.ownerMaster.gameObject,
                    base.gameObject
                });
            }
            if (this.deployablesList == null)
            {
                this.deployablesList = new List <DeployableInfo>();
            }
            int num = 0;
            int deployableSameSlotLimit = this.GetDeployableSameSlotLimit(slot);

            for (int i = this.deployablesList.Count - 1; i >= 0; i--)
            {
                if (this.deployablesList[i].slot == slot)
                {
                    num++;
                    if (num >= deployableSameSlotLimit)
                    {
                        Deployable deployable2 = this.deployablesList[i].deployable;
                        this.deployablesList.RemoveAt(i);
                        deployable2.ownerMaster = null;
                        deployable2.onUndeploy.Invoke();
                    }
                }
            }
            this.deployablesList.Add(new DeployableInfo
            {
                deployable = deployable,
                slot       = slot
            });
            deployable.ownerMaster = this;
        }
        // Token: 0x06000831 RID: 2097 RVA: 0x000233CC File Offset: 0x000215CC
        public int GetDeployableSameSlotLimit(DeployableSlot slot)
        {
            int result = 0;

            switch (slot)
            {
            case DeployableSlot.EngiMine:
                result = 4;
                if (this.bodyInstanceObject)
                {
                    result = this.bodyInstanceObject.GetComponent <SkillLocator>().secondary.maxStock;
                }
                break;

            case DeployableSlot.EngiTurret:
                result = 2;
                break;

            case DeployableSlot.BeetleGuardAlly:
                result = this.inventory.GetItemCount(ItemIndex.BeetleGland);
                break;

            case DeployableSlot.EngiBubbleShield:
                result = 1;
                break;

            case DeployableSlot.LoaderPylon:
                result = 3;
                break;

            case DeployableSlot.EngiSpiderMine:
                result = 4;
                if (this.bodyInstanceObject)
                {
                    result = this.bodyInstanceObject.GetComponent <SkillLocator>().secondary.maxStock;
                }
                break;

            case DeployableSlot.RoboBallMini:
                result = 3;
                break;
            }
            return(result);
        }
Esempio n. 6
0
        public int GetDeployableCount(DeployableSlot slot)
        {
            if (!NetworkServer.active)
            {
                Debug.LogWarning("[Server] function 'System.Int32 RoR2.CharacterMaster::GetDeployableCount(RoR2.DeployableSlot)' called on client");
                return(0);
            }
            if (this.deployablesList == null)
            {
                return(0);
            }
            int num = 0;

            for (int i = this.deployablesList.Count - 1; i >= 0; i--)
            {
                if (this.deployablesList[i].slot == slot)
                {
                    num++;
                }
            }
            return(num);
        }
Esempio n. 7
0
        private void CharacterMaster_AddDeployable(On.RoR2.CharacterMaster.orig_AddDeployable orig, CharacterMaster self, Deployable deployable, DeployableSlot slot)
        {
            orig(self, deployable, slot);
            var turretinventory = self.gameObject.GetComponent<turretinventory>();
            if(turretinventory == null)
            {
                turretinventory = self.gameObject.AddComponent<turretinventory>();
            }

            turretinventory.deployables =  DeployList(self);
            turretinventory.characterMaster = self;
        }
Esempio n. 8
0
        public void AddDeployable(Deployable deployable, DeployableSlot slot)
        {
            if (!NetworkServer.active)
            {
                Debug.LogWarning("[Server] function 'System.Void RoR2.CharacterMaster::AddDeployable(RoR2.Deployable,RoR2.DeployableSlot)' called on client");
                return;
            }
            if (deployable.ownerMaster)
            {
                Debug.LogErrorFormat("Attempted to add deployable {0} which already belongs to master {1} to master {2}.", new object[]
                {
                    deployable.gameObject,
                    deployable.ownerMaster.gameObject,
                    base.gameObject
                });
            }
            if (this.deployablesList == null)
            {
                this.deployablesList = new List <DeployableInfo>();
            }
            int num  = 0;
            int num2 = 0;

            switch (slot)
            {
            case DeployableSlot.EngiMine:
                num2 = 10;
                break;

            case DeployableSlot.EngiTurret:
                num2 = 2;
                break;

            case DeployableSlot.BeetleGuardAlly:
                num2 = this.inventory.GetItemCount(ItemIndex.BeetleGland);
                break;

            case DeployableSlot.EngiBubbleShield:
                num2 = 1;
                break;
            }
            for (int i = this.deployablesList.Count - 1; i >= 0; i--)
            {
                if (this.deployablesList[i].slot == slot)
                {
                    num++;
                    if (num >= num2)
                    {
                        Deployable deployable2 = this.deployablesList[i].deployable;
                        this.deployablesList.RemoveAt(i);
                        deployable2.ownerMaster = null;
                        deployable2.onUndeploy.Invoke();
                    }
                }
            }
            this.deployablesList.Add(new DeployableInfo
            {
                deployable = deployable,
                slot       = slot
            });
            deployable.ownerMaster = this;
        }
Esempio n. 9
0
        private int On_CMGetDeployableSameSlotLimit(On.RoR2.CharacterMaster.orig_GetDeployableSameSlotLimit orig, CharacterMaster self, DeployableSlot slot)
        {
            var retv = orig(self, slot);

            if (slot != DeployableSlot.EngiTurret)
            {
                return(retv);
            }
            var sp = self.GetBody()?.skillLocator?.special;

            if (!sp)
            {
                return(retv);
            }
            if (sp.skillDef == skills.First(x => x is EngiTurret2).myDef)
            {
                return(retv + 1);
            }
            if (sp.skillDef == skills.First(x => x is EngiWalker2).myDef)
            {
                return(retv + 2);
            }
            return(retv);
        }
Esempio n. 10
0
        private int CharacterMaster_GetDeployableSameSlotLimit(On.RoR2.CharacterMaster.orig_GetDeployableSameSlotLimit orig, CharacterMaster self, DeployableSlot slot)
        {
            var result = orig(self, slot);

            if (slot == DeployableSlot.EngiTurret && increaseEngiTurretLimit)
            {
                var itemCount = self.inventory.GetItemCount(itemDef);
                if (itemCount > 0)
                {
                    result += charges + chargesPerStack * (itemCount - 1);
                }
            }
            return(result);
        }
Esempio n. 11
0
        private void TurretEliteInheritance(On.RoR2.CharacterMaster.orig_AddDeployable orig, CharacterMaster self, Deployable deployable, DeployableSlot slot)
        {
            orig(self, deployable, slot);

            if (deployable.gameObject.GetComponentInChildren <CharacterMaster>())
            {
                deployable.gameObject.GetComponentInChildren <CharacterMaster>().inventory.CopyEquipmentFrom(self.inventory);
                deployable.gameObject.GetComponentInChildren <CharacterMaster>().inventory.ResetItem(ItemIndex.AutoCastEquipment);
                deployable.gameObject.GetComponentInChildren <CharacterMaster>().inventory.ResetItem(ItemIndex.TonicAffliction);
            }
            else if (deployable.gameObject.GetComponentInParent <CharacterMaster>())
            {
                deployable.gameObject.GetComponentInParent <CharacterMaster>().inventory.CopyEquipmentFrom(self.inventory);
                deployable.gameObject.GetComponentInParent <CharacterMaster>().inventory.ResetItem(ItemIndex.AutoCastEquipment);
                deployable.gameObject.GetComponentInParent <CharacterMaster>().inventory.ResetItem(ItemIndex.TonicAffliction);
            }
        }
Esempio n. 12
0
 private void On_CMAddDeployable(On.RoR2.CharacterMaster.orig_AddDeployable orig, CharacterMaster self, Deployable dpl, DeployableSlot dpls)
 {
     orig(self, dpl, dpls);
     if (inclDeploys && NetworkServer.active && self.TryGetComponent <LifeSavingsComponent>(out var cpt))
     {
         cpt.ServerUpdateIcnt();
     }
 }
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            //load custom assets
            skillDef = TinkersSatchelPlugin.resources.LoadAsset <SkillDef>("Assets/TinkersSatchel/SkillDefs/EngiUtilitySpeedispenser.asset");
            var tmpDeployableBody = TinkersSatchelPlugin.resources.LoadAsset <GameObject>("Assets/TinkersSatchel/Prefabs/Characters/EngiSpeedispenser/EngiSpeedispenserBody.prefab")
                                    .InstantiateClone("TkSatTempSetupPrefab", false);

            deployableMaster    = TinkersSatchelPlugin.resources.LoadAsset <GameObject>("Assets/TinkersSatchel/Prefabs/Characters/EngiSpeedispenser/EngiSpeedispenserMaster.prefab");
            deployableBlueprint = TinkersSatchelPlugin.resources.LoadAsset <GameObject>("Assets/TinkersSatchel/Prefabs/Characters/EngiSpeedispenser/EngiSpeedispenserBlueprints.prefab");

            //load vanilla assets
            targetSkillFamily = Addressables.LoadAssetAsync <SkillFamily>("RoR2/Base/Engi/EngiBodyUtilityFamily.asset")
                                .WaitForCompletion();
            var captainSupply = Addressables.LoadAssetAsync <GameObject>("RoR2/Base/Captain/CaptainSupplyDrop, EquipmentRestock.prefab")
                                .WaitForCompletion()
                                .InstantiateClone("TkSatTempSetupPrefab2", false);
            var buffIcon = Addressables.LoadAssetAsync <Sprite>("RoR2/DLC1/AttackSpeedAndMoveSpeed/texCoffeeIcon.png")
                           .WaitForCompletion();
            var mainMtl = Addressables.LoadAssetAsync <Material>("RoR2/Base/Engi/matEngiTurret.mat")
                          .WaitForCompletion();
            var bpOkMtl = Addressables.LoadAssetAsync <Material>("RoR2/Base/Engi/matBlueprintsOk.mat")
                          .WaitForCompletion();
            var bpNokMtl = Addressables.LoadAssetAsync <Material>("RoR2/Base/Engi/matBlueprintsInvalid.mat")
                           .WaitForCompletion();
            var ctp = Addressables.LoadAssetAsync <CharacterCameraParams>("RoR2/Base/Common/ccpStandard.asset")
                      .WaitForCompletion();
            var turretBp = Addressables.LoadAssetAsync <GameObject>("RoR2/Base/Engi/EngiTurretBlueprints.prefab")
                           .WaitForCompletion();
            var turretObj = Addressables.LoadAssetAsync <GameObject>("RoR2/Base/Engi/EngiTurretBody.prefab")
                            .WaitForCompletion();
            var bpProjMtl = turretBp.transform.Find("BlobLightProjector").GetComponent <Projector>().material;

            //modify
            speedBuff            = ScriptableObject.CreateInstance <BuffDef>();
            speedBuff.buffColor  = Color.white;
            speedBuff.canStack   = false;
            speedBuff.isDebuff   = false;
            speedBuff.name       = "TKSATEngiSpeedispenserBuff";
            speedBuff.iconSprite = buffIcon;

            tmpDeployableBody.GetComponent <CameraTargetParams>().cameraParams = ctp;
            tmpDeployableBody.GetComponent <ModelLocator>().modelTransform.GetComponent <MeshRenderer>().material = mainMtl;
            var eic = captainSupply.transform.Find("ModelBase/captain supply drop/EnergyIndicatorContainer");

            eic.SetParent(tmpDeployableBody.transform);
            eic.localScale *= 0.5f;
            eic.position   -= new Vector3(0f, 1.5f, 0f);
            var cl = tmpDeployableBody.GetComponent <ModelLocator>().modelTransform.GetComponent <ChildLocator>();

            cl.transformPairs[0].transform = eic;
            cl.transformPairs[1].transform = eic.Find("Canvas/EnergyIndicatorBackgroundPanel/EnergyIndicator");

            GameObject.Destroy(captainSupply);
            deployableBody = tmpDeployableBody.InstantiateClone("EngiSpeedispenserBody", true);
            GameObject.Destroy(tmpDeployableBody);
            deployableMaster.GetComponent <CharacterMaster>().bodyPrefab = deployableBody;

            deployableBlueprint.transform.Find("BlobLight").GetComponent <Projector>().material = bpProjMtl;
            deployableBlueprint.transform.Find("Model Base/SpeedispenserModel").GetComponent <MeshRenderer>().material = bpOkMtl;
            var bp = deployableBlueprint.GetComponent <BlueprintController>();

            bp.okMaterial      = bpOkMtl;
            bp.invalidMaterial = bpNokMtl;

            foreach (var akEvent in turretBp.GetComponents <AkEvent>())
            {
                var newEvent = deployableBlueprint.AddComponent <AkEvent>();
                newEvent.triggerList         = akEvent.triggerList.ToArray().ToList();
                newEvent.useOtherObject      = akEvent.useOtherObject;
                newEvent.actionOnEventType   = akEvent.actionOnEventType;
                newEvent.curveInterpolation  = akEvent.curveInterpolation;
                newEvent.enableActionOnEvent = akEvent.enableActionOnEvent;
                newEvent.data               = akEvent.data;
                newEvent.useCallbacks       = akEvent.useCallbacks;
                newEvent.Callbacks          = akEvent.Callbacks.ToArray().ToList();
                newEvent.playingId          = akEvent.playingId;
                newEvent.soundEmitterObject = deployableBlueprint;
                newEvent.transitionDuration = akEvent.transitionDuration;
            }

            foreach (var akEvent in turretObj.GetComponents <AkEvent>())
            {
                var newEvent = deployableBody.AddComponent <AkEvent>();
                newEvent.triggerList         = akEvent.triggerList.ToArray().ToList();
                newEvent.useOtherObject      = akEvent.useOtherObject;
                newEvent.actionOnEventType   = akEvent.actionOnEventType;
                newEvent.curveInterpolation  = akEvent.curveInterpolation;
                newEvent.enableActionOnEvent = akEvent.enableActionOnEvent;
                newEvent.data               = akEvent.data;
                newEvent.useCallbacks       = akEvent.useCallbacks;
                newEvent.Callbacks          = akEvent.Callbacks.ToArray().ToList();
                newEvent.playingId          = akEvent.playingId;
                newEvent.soundEmitterObject = deployableBody;
                newEvent.transitionDuration = akEvent.transitionDuration;
            }

            //R2API catalog reg

            var dmsSerializable = ContentAddition.AddEntityState <DispenserMainState>(out bool entStateDidSucceed);

            if (!entStateDidSucceed)
            {
                TinkersSatchelPlugin._logger.LogError("EntityState setup failed on EngiUtilitySpeedispenser (DispenserMainState)! Deployable will be unusable.");
            }
            else
            {
                var esm = deployableBody.GetComponent <EntityStateMachine>();
                esm.initialStateType = dmsSerializable;
                esm.mainStateType    = dmsSerializable;
            }

            R2API.Networking.NetworkingAPI.RegisterMessageType <PlaceDispenser.MsgConstructDispenser>();
            ContentAddition.AddBuffDef(speedBuff);
            ContentAddition.AddBody(deployableBody);
            ContentAddition.AddMaster(deployableMaster);
            deployableSlot = DeployableAPI.RegisterDeployableSlot((master, countMult) => {
                return(1);
            });

            skillDef.activationState = ContentAddition.AddEntityState <PlaceDispenser>(out entStateDidSucceed);

            if (!entStateDidSucceed)
            {
                TinkersSatchelPlugin._logger.LogError("EntityState setup failed on EngiUtilitySpeedispenser! Skill will not appear nor function.");
            }
            else if (!ContentAddition.AddSkillDef(skillDef))
            {
                TinkersSatchelPlugin._logger.LogError("SkillDef setup failed on EngiUtilitySpeedispenser! Skill will not appear nor function.");
            }
            else
            {
                setupSucceeded = true;
            }
        }
Esempio n. 14
0
 static DecoyModule()
 {
     deployableSlot = DeployablesCore.AddDeployableSlot(new DeployableSlotDef(1));
 }
Esempio n. 15
0
        private void CharacterMaster_AddDeployable(On.RoR2.CharacterMaster.orig_AddDeployable orig, CharacterMaster self, Deployable deployable, DeployableSlot slot)
        {
            string turretType;
            if (RoR2Application.isInSinglePlayer)
            {
                turretType = currentRule.ToString();
            }
            else
            {
                turretType = Facepunch.Steamworks.Client.Instance.Lobby.GetMemberData(self.GetComponent<PlayerCharacterMasterController>().netId.Value, "Turret");
            }

            if(turretType == "RailGun" || turretType == "2")
            {
                SetToRail();
            }
            else if(turretType == "MiniGun" || turretType == "3")
            {
                SetToMinigun();
            }
            else
            {
                SetToDefault();
            }


            orig(self, deployable, slot);
            var turretinventory = self.gameObject.GetComponent<turretinventory>();
            if (turretinventory == null)
            {
                turretinventory = self.gameObject.AddComponent<turretinventory>();
            }

            turretinventory.deployables = DeployList(self);
            turretinventory.characterMaster = self;
        }
Esempio n. 16
0
        //AddDeployable fires after OnInventoryChanged while creating a turret, so Deployable.ownerMaster won't be set in OIC
        private void On_CMAddDeployable(On.RoR2.CharacterMaster.orig_AddDeployable orig, CharacterMaster self, Deployable depl, DeployableSlot slot)
        {
            orig(self, depl, slot);

            var body = depl.GetComponent <CharacterMaster>()?.GetBody();

            if (body)
            {
                UpdateBarbedWard(body);
            }
        }
Esempio n. 17
0
 private void On_CMAddDeployable(On.RoR2.CharacterMaster.orig_AddDeployable orig, CharacterMaster self, Deployable dpl, DeployableSlot dpls)
 {
     orig(self, dpl, dpls);
     if (inclDeploys && self.hasBody)
     {
         self.GetBody().GetComponent <LifeSavingsComponent>()?.ServerUpdateIcnt();
     }
 }