Пример #1
0
        public static bool AddMemberAndSavePool(PotentialGangMember newMember)
        {
            //check if there isn't an identical entry in the pool
            if (!MemberPool.HasIdenticalEntry(newMember))
            {
                MemberPool.memberList.Add(newMember);
                PersistenceHandler.SaveToFile <PotentialMemberPool>(MemberPool, "MemberPool");
                return(true);
            }

            return(false);
        }
Пример #2
0
        public bool RemoveMemberVariation(PotentialGangMember sadMember) // :(
        {
            for (int i = 0; i < memberVariations.Count; i++)
            {
                if (memberVariations[i].headDrawableIndex == -1)
                {
                    if (memberVariations[i].modelHash == sadMember.modelHash &&
                        (memberVariations[i].legsDrawableIndex == -1 || memberVariations[i].legsDrawableIndex == sadMember.legsDrawableIndex) &&
                        (memberVariations[i].legsTextureIndex == -1 || memberVariations[i].legsTextureIndex == sadMember.legsTextureIndex) &&
                        (memberVariations[i].torsoDrawableIndex == -1 || memberVariations[i].torsoDrawableIndex == sadMember.torsoDrawableIndex) &&
                        (memberVariations[i].torsoTextureIndex == -1 || memberVariations[i].torsoTextureIndex == sadMember.torsoTextureIndex))
                    {
                        memberVariations.Remove(memberVariations[i]);

                        //get new members if we have none now and we're AI-controlled
                        if (memberVariations.Count == 0 && !isPlayerOwned)
                        {
                            GangManager.instance.GetMembersForGang(this);
                        }

                        GangManager.instance.SaveGangData();
                        return(true);
                    }
                }
                else
                {
                    if (memberVariations[i].modelHash == sadMember.modelHash &&
                        memberVariations[i].hairDrawableIndex == sadMember.hairDrawableIndex &&
                        memberVariations[i].headDrawableIndex == sadMember.headDrawableIndex &&
                        memberVariations[i].headTextureIndex == sadMember.headTextureIndex &&
                        memberVariations[i].legsDrawableIndex == sadMember.legsDrawableIndex &&
                        memberVariations[i].legsTextureIndex == sadMember.legsTextureIndex &&
                        memberVariations[i].torsoDrawableIndex == sadMember.torsoDrawableIndex &&
                        memberVariations[i].torsoTextureIndex == sadMember.torsoTextureIndex)
                    {
                        memberVariations.Remove(memberVariations[i]);

                        //get new members if we have none now and we're AI-controlled
                        if (memberVariations.Count == 0 && !isPlayerOwned)
                        {
                            GangManager.instance.GetMembersForGang(this);
                        }

                        GangManager.instance.SaveGangData();
                        return(true);
                    }
                }
            }

            return(false);
        }
Пример #3
0
        public static bool RemoveMemberAndSavePool(PotentialGangMember newMember)
        {
            //find an identical or similar entry and remove it
            PotentialGangMember similarEntry = MemberPool.GetSimilarEntry(newMember);

            if (similarEntry != null)
            {
                MemberPool.memberList.Remove(similarEntry);
                PersistenceHandler.SaveToFile <PotentialMemberPool>(MemberPool, "MemberPool");
                return(true);
            }

            return(false);
        }
Пример #4
0
 public void GetMembersForGang(Gang targetGang)
 {
     PotentialGangMember.MemberColor gangColor = ModOptions.instance.TranslateVehicleToMemberColor(targetGang.vehicleColor);
     PotentialGangMember.DressStyle  gangStyle = (PotentialGangMember.DressStyle)RandoMath.CachedRandom.Next(3);
     for (int i = 0; i < RandoMath.CachedRandom.Next(2, 6); i++)
     {
         PotentialGangMember newMember = PotentialGangMember.GetMemberFromPool(gangStyle, gangColor);
         if (newMember != null)
         {
             targetGang.AddMemberVariation(newMember);
         }
         else
         {
             break;
         }
     }
 }
Пример #5
0
        public bool AddMemberVariation(PotentialGangMember newMember)
        {
            for (int i = 0; i < memberVariations.Count; i++)
            {
                if (memberVariations[i].modelHash == newMember.modelHash &&
                    memberVariations[i].hairDrawableIndex == newMember.hairDrawableIndex &&
                    memberVariations[i].headDrawableIndex == newMember.headDrawableIndex &&
                    memberVariations[i].headTextureIndex == newMember.headTextureIndex &&
                    memberVariations[i].legsDrawableIndex == newMember.legsDrawableIndex &&
                    memberVariations[i].legsTextureIndex == newMember.legsTextureIndex &&
                    memberVariations[i].torsoDrawableIndex == newMember.torsoDrawableIndex &&
                    memberVariations[i].torsoTextureIndex == newMember.torsoTextureIndex)
                {
                    return(false);
                }
            }

            memberVariations.Add(newMember);
            GangManager.instance.SaveGangData(isPlayerOwned);
            return(true);
        }
Пример #6
0
            /// <summary>
            /// gets a similar entry to the member provided.
            /// it may not be the only similar one, however
            /// </summary>
            /// <param name="potentialEntry"></param>
            /// <returns></returns>
            public PotentialGangMember GetSimilarEntry(PotentialGangMember potentialEntry)
            {
                if (potentialEntry.GetType() == typeof(FreemodePotentialGangMember))
                {
                    return(FreemodePotentialGangMember.FreemodeSimilarEntryCheck(potentialEntry as FreemodePotentialGangMember));
                }

                for (int i = 0; i < memberList.Count; i++)
                {
                    if (memberList[i].modelHash == potentialEntry.modelHash &&
                        (memberList[i].hairDrawableIndex == -1 || memberList[i].hairDrawableIndex == potentialEntry.hairDrawableIndex) &&
                        (memberList[i].headDrawableIndex == -1 || memberList[i].headDrawableIndex == potentialEntry.headDrawableIndex) &&
                        (memberList[i].headTextureIndex == -1 || memberList[i].headTextureIndex == potentialEntry.headTextureIndex) &&
                        (memberList[i].legsDrawableIndex == -1 || memberList[i].legsDrawableIndex == potentialEntry.legsDrawableIndex) &&
                        (memberList[i].legsTextureIndex == -1 || memberList[i].legsTextureIndex == potentialEntry.legsTextureIndex) &&
                        (memberList[i].torsoDrawableIndex == -1 || memberList[i].torsoDrawableIndex == potentialEntry.torsoDrawableIndex) &&
                        (memberList[i].torsoTextureIndex == -1 || memberList[i].torsoTextureIndex == potentialEntry.torsoTextureIndex))
                    {
                        return(memberList[i]);
                    }
                }
                return(null);
            }
Пример #7
0
            public bool HasIdenticalEntry(PotentialGangMember potentialEntry)
            {
                if (potentialEntry.GetType() == typeof(FreemodePotentialGangMember))
                {
                    return(FreemodePotentialGangMember.FreemodeSimilarEntryCheck(potentialEntry as FreemodePotentialGangMember) != null);
                }


                for (int i = 0; i < memberList.Count; i++)
                {
                    if (memberList[i].modelHash == potentialEntry.modelHash &&
                        memberList[i].hairDrawableIndex == potentialEntry.hairDrawableIndex &&
                        memberList[i].headDrawableIndex == potentialEntry.headDrawableIndex &&
                        memberList[i].headTextureIndex == potentialEntry.headTextureIndex &&
                        memberList[i].legsDrawableIndex == potentialEntry.legsDrawableIndex &&
                        memberList[i].legsTextureIndex == potentialEntry.legsTextureIndex &&
                        memberList[i].torsoDrawableIndex == potentialEntry.torsoDrawableIndex &&
                        memberList[i].torsoTextureIndex == potentialEntry.torsoTextureIndex)
                    {
                        return(true);
                    }
                }
                return(false);
            }
Пример #8
0
        public SpawnedGangMember SpawnGangMember(Gang ownerGang, Vector3 spawnPos, SuccessfulMemberSpawnDelegate onSuccessfulMemberSpawn = null)
        {
            if (livingMembersCount >= ModOptions.instance.spawnedMemberLimit || spawnPos == Vector3.Zero || ownerGang.memberVariations == null)
            {
                //don't start spawning, we're on the limit already or we failed to find a good spawn point or we haven't started up our data properly yet
                return(null);
            }
            if (ownerGang.memberVariations.Count > 0)
            {
                Logger.Log("spawn member: begin");
                PotentialGangMember chosenMember =
                    RandoMath.GetRandomElementFromList(ownerGang.memberVariations);
                Ped newPed = World.CreatePed(chosenMember.modelHash, spawnPos);
                if (newPed != null)
                {
                    chosenMember.SetPedAppearance(newPed);

                    newPed.Accuracy  = ownerGang.memberAccuracyLevel;
                    newPed.MaxHealth = ownerGang.memberHealth;
                    newPed.Health    = ownerGang.memberHealth;
                    newPed.Armor     = ownerGang.memberArmor;

                    newPed.Money = RandoMath.CachedRandom.Next(60);

                    //set the blip, if enabled
                    if (ModOptions.instance.showGangMemberBlips)
                    {
                        newPed.AddBlip();
                        newPed.CurrentBlip.IsShortRange = true;
                        newPed.CurrentBlip.Scale        = 0.65f;
                        Function.Call(Hash.SET_BLIP_COLOUR, newPed.CurrentBlip, ownerGang.blipColor);

                        //set blip name - got to use native, the c# blip.name returns error ingame
                        Function.Call(Hash.BEGIN_TEXT_COMMAND_SET_BLIP_NAME, "STRING");
                        Function.Call(Hash._ADD_TEXT_COMPONENT_STRING, ownerGang.name + " member");
                        Function.Call(Hash.END_TEXT_COMMAND_SET_BLIP_NAME, newPed.CurrentBlip);
                    }


                    bool hasDriveByGun = false; //used for when the member has to decide between staying inside a vehicle or not

                    //give a weapon
                    if (ownerGang.gangWeaponHashes.Count > 0)
                    {
                        //get one weap from each type... if possible AND we're not forcing melee only
                        newPed.Weapons.Give(ownerGang.GetListedGunFromOwnedGuns(ModOptions.instance.meleeWeapons), 1000, false, true);
                        if (!ModOptions.instance.membersSpawnWithMeleeOnly)
                        {
                            WeaponHash driveByGun = ownerGang.GetListedGunFromOwnedGuns(ModOptions.instance.driveByWeapons);
                            hasDriveByGun = driveByGun != WeaponHash.Unarmed;
                            newPed.Weapons.Give(driveByGun, 1000, false, true);
                            newPed.Weapons.Give(ownerGang.GetListedGunFromOwnedGuns(ModOptions.instance.primaryWeapons), 1000, false, true);

                            //and one extra
                            newPed.Weapons.Give(RandoMath.GetRandomElementFromList(ownerGang.gangWeaponHashes), 1000, false, true);
                        }
                    }

                    //set the relationship group
                    newPed.RelationshipGroup = ownerGang.relationGroupIndex;

                    newPed.NeverLeavesGroup = true;

                    //newPed.BlockPermanentEvents = true;
                    //newPed.StaysInVehicleWhenJacked = true;

                    Function.Call(Hash.SET_CAN_ATTACK_FRIENDLY, newPed, false, false); //cannot attack friendlies
                    Function.Call(Hash.SET_PED_COMBAT_ABILITY, newPed, 100);           //average combat ability
                    //Function.Call(Hash.SET_PED_FLEE_ATTRIBUTES, newPed, 0, 0); //clears the flee attributes?

                    Function.Call(Hash.SET_PED_COMBAT_ATTRIBUTES, newPed, 46, true); // alwaysFight = true and canFightArmedWhenNotArmed. which one is which is unknown
                    Function.Call(Hash.SET_PED_COMBAT_ATTRIBUTES, newPed, 5, true);
                    Function.Call(Hash.SET_PED_COMBAT_RANGE, newPed, 2);             //combatRange = far

                    newPed.CanSwitchWeapons = true;
                    newPed.CanWrithe        = false; //no early dying

                    //enlist this new gang member in the spawned list!
                    SpawnedGangMember newMemberAI = null;

                    bool couldEnlistWithoutAdding = false;
                    for (int i = 0; i < livingMembers.Count; i++)
                    {
                        if (livingMembers[i].watchedPed == null)
                        {
                            livingMembers[i].AttachData(newPed, ownerGang, hasDriveByGun);
                            newMemberAI = livingMembers[i];
                            couldEnlistWithoutAdding = true;
                            break;
                        }
                    }
                    if (!couldEnlistWithoutAdding)
                    {
                        if (livingMembers.Count < ModOptions.instance.spawnedMemberLimit)
                        {
                            newMemberAI = new SpawnedGangMember(newPed, ownerGang, hasDriveByGun);
                            livingMembers.Add(newMemberAI);
                        }
                    }

                    livingMembersCount++;
                    onSuccessfulMemberSpawn?.Invoke();
                    Logger.Log("spawn member: end (success). livingMembers list size = " + livingMembers.Count);
                    return(newMemberAI);
                }
                else
                {
                    Logger.Log("spawn member: end with fail (world createped returned null)");
                    return(null);
                }
            }
            return(null);
        }