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); }
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); }
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); }
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; } } }
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); }
/// <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); }
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); }
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); }