Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Codeware.Localization.*
- // ### SYSTÈME DE CACHE ###
- public abstract class ALDataCache{
- public static func GetCachedALData(ammoType:String,config:ref<AmmoLimiterConfig>) -> ref<ALData>{
- let cache=ALDataCache.EnsureCache();
- let configHash=ALDataCache.GetConfigHash(config);
- let key:Uint64=TDBID.ToNumber(TDBID.Create(ammoType+"_"+configHash));
- if cache.KeyExist(key){return cache.Get(key) as ALData;}
- let data=ALUtils.GetALData(ammoType,config);
- cache.Insert(key,data);
- return data;
- }
- private static func GetConfigHash(config:ref<AmmoLimiterConfig>) -> String{
- let hash:String="";
- hash+=ToString(config.handModeSelected);
- hash+="_"+IntToString(config.ammoLimitHandgun);
- hash+="_"+IntToString(config.ammoLimitRifle);
- hash+="_"+IntToString(config.ammoLimitShotgun);
- hash+="_"+IntToString(config.ammoLimitSniper);
- hash+="_"+IntToString(config.ammoBoxHandgun);
- hash+="_"+IntToString(config.ammoBoxRifle);
- hash+="_"+IntToString(config.ammoBoxShotgun);
- hash+="_"+IntToString(config.ammoBoxSniper);
- hash+="_"+FloatToString(config.ammoWeightHandgun);
- hash+="_"+FloatToString(config.ammoWeightRifle);
- hash+="_"+FloatToString(config.ammoWeightShotgun);
- hash+="_"+FloatToString(config.ammoWeightSniper);
- hash+="_"+FloatToString(config.ammoPriceHandgun);
- hash+="_"+FloatToString(config.ammoPriceRifle);
- hash+="_"+FloatToString(config.ammoPriceShotgun);
- hash+="_"+FloatToString(config.ammoPriceSniper);
- return hash;
- }
- private static func EnsureCache() -> ref<inkHashMap>{
- let gameInstance=GetGameInstance();
- let system=gameInstance.GetScriptableSystemsContainer().Get(n"ALSystem") as ALSystem;
- return system.GetCache();
- }
- }
- // ### UTILITAIRES ###
- public class ALData extends IScriptable{
- public let ammoTDBID:TweakDBID;
- public let limit:Int32;
- public let ammoBox:Int32;
- public let handLimit:Int32;
- public let handMin:Int32;
- public let handMax:Int32;
- public let ammoWeight:Float;
- public let priceMult:Float;
- public let ammoConv:Float;
- public let ammoCraft:Int32;
- }
- public class ALUtils{
- public static func GetAmmoTypeNames() -> array<String>{return ["Handgun","Rifle","Shotgun","SniperRifle"];}
- public static func GetAmmoTDBID(ammoType:String) -> TweakDBID{return TDBID.Create("Ammo."+ammoType+"Ammo");}
- public static func GetAmmoTypeFromID(ammoType:ItemID) -> String{
- let fullName=TDBID.ToStringDEBUG(ItemID.GetTDBID(ammoType));
- return !StrBeginsWith(fullName,"Ammo.")?"":StrEndsWith(fullName,"Ammo") && StrLen(fullName)>9?StrMid(fullName,5,StrLen(fullName)-9):StrMid(fullName,5);
- }
- public static func GetAmmoTypeFromWeaponType(weaponType:gamedataItemType) -> String{
- switch weaponType{
- case gamedataItemType.Wea_Handgun:
- case gamedataItemType.Wea_Revolver:
- case gamedataItemType.Wea_SubmachineGun:
- return "Handgun";
- case gamedataItemType.Wea_AssaultRifle:
- case gamedataItemType.Wea_Rifle:
- case gamedataItemType.Wea_LightMachineGun:
- case gamedataItemType.Wea_HeavyMachineGun:
- return "Rifle";
- case gamedataItemType.Wea_Shotgun:
- case gamedataItemType.Wea_ShotgunDual:
- return "Shotgun";
- case gamedataItemType.Wea_SniperRifle:
- case gamedataItemType.Wea_PrecisionRifle:
- return "SniperRifle";
- default:
- return "";
- }
- }
- public static func GetActiveWeaponAmmoType(player:ref<PlayerPuppet>) -> String{
- let weapon=GameInstance.GetTransactionSystem(player.GetGame()).GetItemInSlot(player,t"AttachmentSlots.WeaponRight") as WeaponObject;
- return IsDefined(weapon)?ALUtils.GetAmmoTypeFromID(WeaponObject.GetAmmoType(weapon)):"";
- }
- public static func GetALData(ammoType:String,config:ref<AmmoLimiterConfig>) -> ref<ALData>{
- let data=new ALData();
- data.ammoTDBID=ALUtils.GetAmmoTDBID(ammoType);
- switch ammoType{
- case "Handgun":
- data.limit=config.ammoLimitHandgun;
- data.ammoBox=config.ammoBoxHandgun;
- data.handLimit=config.handLimitHandgun;
- data.handMin=config.handMinHandgun;
- data.handMax=config.handMaxHandgun;
- data.ammoWeight=config.ammoWeightHandgun;
- data.priceMult=config.ammoPriceHandgun;
- data.ammoConv=Cast<Float>(config.craftingCompForAmmo)/Cast<Float>(config.ammoCraftHandgun)*Cast<Float>(config.ammoConversionRate);
- data.ammoCraft=config.ammoCraftHandgun;
- break;
- case "Rifle":
- data.limit=config.ammoLimitRifle;
- data.ammoBox=config.ammoBoxRifle;
- data.handLimit=config.handLimitRifle;
- data.handMin=config.handMinRifle;
- data.handMax=config.handMaxRifle;
- data.ammoWeight=config.ammoWeightRifle;
- data.priceMult=config.ammoPriceRifle;
- data.ammoConv=Cast<Float>(config.craftingCompForAmmo)/Cast<Float>(config.ammoCraftRifle)*Cast<Float>(config.ammoConversionRate);
- data.ammoCraft=config.ammoCraftRifle;
- break;
- case "Shotgun":
- data.limit=config.ammoLimitShotgun;
- data.ammoBox=config.ammoBoxShotgun;
- data.handLimit=config.handLimitShotgun;
- data.handMin=config.handMinShotgun;
- data.handMax=config.handMaxShotgun;
- data.ammoWeight=config.ammoWeightShotgun;
- data.priceMult=config.ammoPriceShotgun;
- data.ammoConv=Cast<Float>(config.craftingCompForAmmo)/Cast<Float>(config.ammoCraftShotgun)*Cast<Float>(config.ammoConversionRate);
- data.ammoCraft=config.ammoCraftShotgun;
- break;
- case "SniperRifle":
- data.limit=config.ammoLimitSniper;
- data.ammoBox=config.ammoBoxSniper;
- data.handLimit=config.handLimitSniper;
- data.handMin=config.handMinSniper;
- data.handMax=config.handMaxSniper;
- data.ammoWeight=config.ammoWeightSniper;
- data.priceMult=config.ammoPriceSniper;
- data.ammoConv=Cast<Float>(config.craftingCompForAmmo)/Cast<Float>(config.ammoCraftSniper)*Cast<Float>(config.ammoConversionRate);
- data.ammoCraft=config.ammoCraftSniper;
- break;
- }
- return data;
- }
- }
- // ### SYSTÈME DE MESSAGE ###
- @addMethod(PlayerPuppet)
- private func ALMessage(message:String) -> Void{
- let blackboard=GameInstance.GetBlackboardSystem(this.GetGame()).Get(GetAllBlackboardDefs().UI_Notifications);
- if IsDefined(blackboard){
- let msg:SimpleScreenMessage;
- msg.isShown=true;
- msg.message=message;
- blackboard.SetVariant(GetAllBlackboardDefs().UI_Notifications.OnscreenMessage,ToVariant(msg),true);
- }
- }
- // ### SYSTÈME D’INITIALISATION ###
- public class ALDelayCallback extends DelayCallback{
- let m_system:wref<ALSystem>;
- public static func Create(system:ref<ALSystem>) -> ref<ALDelayCallback>{
- let callback=new ALDelayCallback();
- callback.m_system=system;
- return callback;
- }
- public func Call() -> Void{if IsDefined(this.m_system){this.m_system.ApplyAmmoConfig();}}
- }
- public class ALSystem extends ScriptableSystem{
- private let config:ref<AmmoLimiterConfig>;
- private let m_cache:ref<inkHashMap>;
- public static func GetConfig() -> ref<AmmoLimiterConfig>{
- let gameInstance=GetGameInstance();
- let alSystem=gameInstance.GetScriptableSystemsContainer().Get(n"ALSystem") as ALSystem;
- if !IsDefined(alSystem.config){
- alSystem.config=new AmmoLimiterConfig();
- }
- return alSystem.config;
- }
- private func OnAttach(){
- this.m_cache=new inkHashMap();
- this.config=new AmmoLimiterConfig();
- this.ApplyAmmoConfig();
- GameInstance.GetCallbackSystem().RegisterCallback(n"Session/Start",this,n"OnSessionStart");
- }
- public func GetCache() -> ref<inkHashMap>{return this.m_cache;}
- public final func OnSessionStart(evt:ref<GameSessionEvent>) -> Void{GameInstance.GetDelaySystem(this.GetGameInstance()).DelayCallback(ALDelayCallback.Create(this),0.075);}
- public final func ApplyAmmoConfig() -> Void{
- this.config=ALSystem.GetConfig();
- let ammoTypes=ALUtils.GetAmmoTypeNames();
- this.CreateAndApplyAmmoMods(this.config,ammoTypes);
- this.ApplyHandSys(this.config,ammoTypes);
- this.ApplyAmmoBoxQties(this.config);
- }
- private final func CreateAndApplyAmmoMods(config:ref<AmmoLimiterConfig>,ammoTypes:array<String>) -> Void{
- for ammoType in ammoTypes{
- let ammoData=ALDataCache.GetCachedALData(ammoType,config);
- let basePath="AmmoLimiter."+ammoType;
- let buyModID=TDBID.Create(basePath+".buyPrice");
- let sellModID=TDBID.Create(basePath+".sellPrice");
- let weightModID=TDBID.Create(basePath+".statModifiers");
- let quantityModID=TDBID.Create(basePath+".quantity");
- TweakDBManager.CreateRecord(StringToName(basePath),n"gamedataItem_Record");
- TweakDBManager.CreateRecord(StringToName(basePath+".buyPrice"),n"gamedataConstantStatModifier_Record");
- TweakDBManager.CreateRecord(StringToName(basePath+".sellPrice"),n"gamedataConstantStatModifier_Record");
- TweakDBManager.CreateRecord(StringToName(basePath+".statModifiers"),n"gamedataConstantStatModifier_Record");
- TweakDBManager.CreateRecord(StringToName(basePath+".quantity"),n"gamedataConstantStatModifier_Record");
- TweakDBManager.SetFlat(quantityModID+t".modifierType",n"Additive");
- TweakDBManager.SetFlat(quantityModID+t".statType",t"BaseStats.Quantity");
- TweakDBManager.SetFlat(quantityModID+t".value",9999.0);
- TweakDBManager.SetFlat(buyModID+t".modifierType",n"Multiplier");
- TweakDBManager.SetFlat(buyModID+t".statType",t"BaseStats.Price");
- TweakDBManager.SetFlat(buyModID+t".value",ammoData.priceMult);
- TweakDBManager.SetFlat(sellModID+t".modifierType",n"Multiplier");
- TweakDBManager.SetFlat(sellModID+t".statType",t"BaseStats.Price");
- TweakDBManager.SetFlat(sellModID+t".value",ammoData.priceMult/3.0);
- TweakDBManager.SetFlat(weightModID+t".modifierType",n"Additive");
- TweakDBManager.SetFlat(weightModID+t".statType",t"BaseStats.Weight");
- TweakDBManager.SetFlat(weightModID+t".value",ammoData.ammoWeight);
- TweakDBManager.SetFlat(ammoData.ammoTDBID+t".buyPrice",[t"Price.Ammo",t"Price.BuyPrice_StreetCred_Discount",buyModID]);
- TweakDBManager.SetFlat(ammoData.ammoTDBID+t".sellPrice",[t"Price.Ammo",sellModID]);
- TweakDBManager.SetFlat(ammoData.ammoTDBID+t".statModifiers",[quantityModID,weightModID]);
- TweakDBManager.SetFlat(ammoData.ammoTDBID+t".objectActions",[t"ItemAction.Drop",t"ItemAction.Disassemble"]);
- TweakDBManager.UpdateRecord(buyModID);
- TweakDBManager.UpdateRecord(sellModID);
- TweakDBManager.UpdateRecord(weightModID);
- TweakDBManager.UpdateRecord(quantityModID);
- TweakDBManager.UpdateRecord(ammoData.ammoTDBID);
- }
- }
- private final func ApplyHandSys(config:ref<AmmoLimiterConfig>,ammoTypes:array<String>) -> Void{
- for ammoType in ammoTypes{
- let ammoData=ALDataCache.GetCachedALData(ammoType,config);
- let recordID=TDBID.Create("Ammo.Handicap"+ammoType+"AmmoPreset");
- let limit=Equals(config.handModeSelected,handMode.Disabled)?99999:Equals(config.handModeSelected,handMode.Optimized)?ammoData.limit:ammoData.handLimit;
- let min=Equals(config.handModeSelected,handMode.Disabled)?0:Equals(config.handModeSelected,handMode.Optimized)?0:ammoData.handMin;
- let max=Equals(config.handModeSelected,handMode.Disabled)?0:Equals(config.handModeSelected,handMode.Optimized)?ammoData.limit/10:ammoData.handMax;
- TweakDBManager.SetFlat(recordID+t".handicapLimit",limit);
- TweakDBManager.SetFlat(recordID+t".handicapMinQty",min);
- TweakDBManager.SetFlat(recordID+t".handicapMaxQty",max);
- TweakDBManager.UpdateRecord(recordID);
- }
- }
- private final func ApplyAmmoBoxQties(config:ref<AmmoLimiterConfig>) -> Void{
- let mappings=[
- ["Handgun","AmmoLootTable_inline0"],
- ["Shotgun","AmmoLootTable_inline1"],
- ["Rifle","AmmoLootTable_inline2"],
- ["SniperRifle","AmmoLootTable_inline3"]
- ];
- let i:Int32=0;
- while i<ArraySize(mappings){
- let ammoType=mappings[i][0];
- let lootTableID=mappings[i][1];
- let ammoData=ALDataCache.GetCachedALData(ammoType,config);
- let recordID=TDBID.Create("Ammo."+lootTableID);
- TweakDBManager.SetFlat(recordID+t".dropCountMin",ammoData.ammoBox/2);
- TweakDBManager.SetFlat(recordID+t".dropCountMax",ammoData.ammoBox);
- TweakDBManager.UpdateRecord(recordID);
- i+=1;
- }
- }
- }
- // ### SYSTÈME DE RAMASSAGE ###
- @wrapMethod(PlayerPuppet)
- protected cb func OnItemChangedEvent(evt:ref<ItemChangedEvent>) -> Bool{
- let result=wrappedMethod(evt);
- if evt.difference==0{return result;}
- if !ItemID.IsValid(evt.itemID) || GameInstance.GetBlackboardSystem(this.GetGame()).Get(GetAllBlackboardDefs().UI_System).GetBool(GetAllBlackboardDefs().UI_System.IsInMenu){return result;}
- if !Equals(TweakDBInterface.GetItemRecord(ItemID.GetTDBID(evt.itemID)).ItemType().Type(),gamedataItemType.Con_Ammo){return result;}
- let ammoType=ALUtils.GetAmmoTypeFromID(evt.itemID);
- if Equals(ammoType,""){return result;}
- let config=ALSystem.GetConfig();
- let ammoData=ALDataCache.GetCachedALData(ammoType,config);
- let transactionSystem=GameInstance.GetTransactionSystem(GetGameInstance());
- let curAmount=transactionSystem.GetItemQuantity(this,evt.itemID);
- let effectiveLimit:Int32;
- let isActiveAmmo=Equals(ammoType,ALUtils.GetActiveWeaponAmmoType(this));
- if config.sleepingAmmoControl && !isActiveAmmo{
- let addedAmount=evt.difference;
- let preAmount=curAmount-addedAmount;
- effectiveLimit=preAmount;
- }else if isActiveAmmo && config.activeWeaponBonus>100{effectiveLimit=(ammoData.limit*config.activeWeaponBonus)/100;}else{effectiveLimit=ammoData.limit;}
- if curAmount<=effectiveLimit{return result;}
- let excess=curAmount-effectiveLimit;
- if ammoData.ammoConv==0.0 && config.autoSell==0{
- GameInstance.GetLootManager(GetGameInstance()).SpawnItemDropOfManyItems(this,[DropInstruction.Create(evt.itemID,excess)],n"playerDropBag",this.GetWorldPosition());
- if config.messageDisplay{this.ALMessage(ToString(excess)+" "+GetLocalizedTextByKey(TweakDBInterface.GetItemRecord(ItemID.GetTDBID(evt.itemID)).DisplayName())+" "+GetLocalizedTextByKey(n"AmmoLimiter-Message-Dropped")+".");}
- }else{
- let totalComp=ammoData.ammoConv>0.0?Cast<Int32>(Cast<Float>(excess)*ammoData.ammoConv*0.01):0;
- let totalEddies=config.autoSell>0?Cast<Int32>(Cast<Float>(excess*3*config.autoSell)*ammoData.priceMult*0.01):0;
- if totalComp==0 && totalEddies==0{return result;}
- let actualExcess=totalComp>0?Cast<Int32>(Cast<Float>(totalComp)/ammoData.ammoConv*100.0):excess;
- transactionSystem.RemoveItem(this,evt.itemID,actualExcess);
- let msg=config.messageDisplay?ToString(actualExcess)+" "+GetLocalizedTextByKey(TweakDBInterface.GetItemRecord(ItemID.GetTDBID(evt.itemID)).DisplayName())+" "+GetLocalizedTextByKey(n"AmmoLimiter-Message-Crafted")+" ":"";
- if totalComp>0{
- transactionSystem.GiveItem(this,ItemID.FromTDBID(t"Items.CommonMaterial1"),totalComp,[n"AmmoLimiter"]);
- if config.messageDisplay{msg+=ToString(totalComp)+" "+GetLocalizedTextByKey(TweakDBInterface.GetItemRecord(t"Items.CommonMaterial1").DisplayName());}
- }
- if totalEddies>0{
- transactionSystem.GiveItem(this,ItemID.FromTDBID(t"Items.money"),totalEddies,[n"AmmoLimiter"]);
- if config.messageDisplay{msg+=(totalComp>0?"\\n+ ":"")+ToString(totalEddies)+" €$";}
- }
- if config.messageDisplay{this.ALMessage(msg+".");}
- }
- return result;
- }
- // ### SYSTÈME DE DÉMONTAGE ###
- @wrapMethod(RPGManager)
- public final static func CanItemBeDisassembled(gameInstance:GameInstance,itemData:wref<gameItemData>) -> Bool{
- let config=ALSystem.GetConfig();
- return IsDefined(itemData) && config.ammoDisassDisabled && itemData.HasTag(n"Ammo")?false:wrappedMethod(gameInstance,itemData);
- }
- @wrapMethod(DisassembleAction)
- public func CompleteAction(gameInstance:GameInstance) -> Void{
- let itemData=this.GetItemData();
- let config=ALSystem.GetConfig();
- let executor=this.GetExecutor();
- wrappedMethod(gameInstance);
- if config.ammoDisass>0 && IsDefined(executor) && IsDefined(itemData){
- let player=executor as PlayerPuppet;
- if !IsDefined(player){return;}
- let record=TweakDBInterface.GetItemRecord(ItemID.GetTDBID(itemData.GetID())) as WeaponItem_Record;
- if !IsDefined(record){return;}
- let maxAmmo=Cast<Int32>(GameInstance.GetStatsSystem(gameInstance).GetStatValue(Cast<StatsObjectID>(itemData.GetID()),gamedataStatType.MagazineCapacityBase))*config.ammoDisass/100;
- if maxAmmo<=0{return;}
- let ammoData=ALDataCache.GetCachedALData(ALUtils.GetAmmoTypeFromWeaponType(record.ItemType().Type()),config);
- if Equals(ammoData.ammoTDBID,t""){return;}
- let ammoAmount=RandRange(0,maxAmmo+1);
- if ammoAmount>0{
- GameInstance.GetTransactionSystem(gameInstance).GiveItem(player,ItemID.FromTDBID(ammoData.ammoTDBID),ammoAmount);
- if config.messageDisplay{player.ALMessage(GetLocalizedTextByKey(n"AmmoLimiter-Message-Recovered")+" "+ToString(ammoAmount)+" "+GetLocalizedTextByKey(TweakDBInterface.GetItemRecord(ammoData.ammoTDBID).DisplayName())+".");}
- }
- }
- }
- @wrapMethod(CraftingSystem)
- private func OnDisassembleItemRequest(request:ref<DisassembleItemRequest>) -> Void{
- let config=ALSystem.GetConfig();
- let itemData=GameInstance.GetTransactionSystem(this.GetGameInstance()).GetItemData(request.target,request.itemID);
- if IsDefined(itemData) && itemData.HasTag(n"Ammo"){
- let originalAmount=request.amount;
- for ammoType in ALUtils.GetAmmoTypeNames(){
- if Equals(ItemID.GetTDBID(itemData.GetID()),ALUtils.GetAmmoTDBID(ammoType)){
- let ammoData=ALDataCache.GetCachedALData(ammoType,config);
- let ammoPerComp=Cast<Float>(ammoData.ammoCraft)/Cast<Float>(config.craftingCompForAmmo);
- let requestedComps=FloorF(Cast<Float>(originalAmount)/ammoPerComp);
- if requestedComps>=1{
- let exactFloat=Cast<Float>(requestedComps)*ammoPerComp;
- let exactInt=Cast<Int32>(exactFloat);
- if Cast<Float>(exactInt)==exactFloat{request.amount=exactInt;}else{request.amount=requestedComps*CeilF(ammoPerComp);}
- }else{request.amount=0;}
- if request.amount>0{
- let removedEvent=new ItemBeingRemovedEvent();
- removedEvent.itemID=request.itemID;
- removedEvent.itemData=itemData;
- removedEvent.difference=request.amount;
- removedEvent.currentQuantity=0;
- let player=GameInstance.GetPlayerSystem(this.GetGameInstance()).GetLocalPlayerMainGameObject() as PlayerPuppet;
- player.QueueEvent(removedEvent);
- }
- break;
- }
- }
- }
- wrappedMethod(request);
- }
- @wrapMethod(CraftingSystem)
- private func DisassembleItem(target:wref<GameObject>,itemID:ItemID,quantity:Int32) -> Void{
- let itemData=GameInstance.GetTransactionSystem(this.GetGameInstance()).GetItemData(target,itemID);
- if IsDefined(itemData) && itemData.HasTag(n"Ammo"){
- let config=ALSystem.GetConfig();
- for ammoType in ALUtils.GetAmmoTypeNames(){
- if Equals(ItemID.GetTDBID(itemData.GetID()),ALUtils.GetAmmoTDBID(ammoType)){
- let restoredAttachments:array<ItemAttachments>;
- let vanillaResults=this.GetDisassemblyResultItems(target,itemID,1,restoredAttachments);
- if ArraySize(vanillaResults)>0{
- let ammoData=ALDataCache.GetCachedALData(ammoType,config);
- let correctComps=Cast<Int32>(Cast<Float>(quantity*config.craftingCompForAmmo)/Cast<Float>(ammoData.ammoCraft));
- GameInstance.GetTelemetrySystem(this.GetGameInstance()).LogItemDisassembled(target,itemID);
- let listOfIngredients:array<IngredientData>;
- if correctComps>0{
- GameInstance.GetTransactionSystem(this.GetGameInstance()).RemoveItem(target,itemID,quantity);
- GameInstance.GetTransactionSystem(this.GetGameInstance()).GiveItem(target,ItemID.FromTDBID(vanillaResults[0].id.GetID()),correctComps);
- let ingredient:IngredientData;
- ingredient.id=vanillaResults[0].id;
- ingredient.quantity=correctComps;
- ArrayPush(listOfIngredients,ingredient);
- }
- let Blackboard:ref<IBlackboard>=GameInstance.GetBlackboardSystem(this.GetGameInstance()).Get(GetAllBlackboardDefs().UI_Crafting);
- if IsDefined(Blackboard){
- Blackboard.SetVariant(GetAllBlackboardDefs().UI_Crafting.lastCommand,ToVariant(CraftingCommands.DisassemblingFinished),true);
- Blackboard.SetVariant(GetAllBlackboardDefs().UI_Crafting.lastItem,ToVariant(itemID),true);
- if ArraySize(listOfIngredients)>0{Blackboard.SetVariant(GetAllBlackboardDefs().UI_Crafting.lastIngredients,ToVariant(listOfIngredients),true);}
- }
- return;
- }
- }
- }
- }
- wrappedMethod(target,itemID,quantity);
- }
- // ### FILTRES D’INVENTAIRE ###
- @wrapMethod(ItemCategoryFliter)
- public final static func FilterItem(filter:ItemFilterCategory,wrappedData:ref<WrappedInventoryItemData>) -> Bool{
- if IsDefined(wrappedData.Item) && Equals(wrappedData.Item.GetItemType(),gamedataItemType.Con_Ammo){
- let ammoCat=ALSystem.GetConfig().ammoCategorySelected;
- return (Equals(ammoCat,ammoCategory.RangedWeapons) && (Equals(filter,ItemFilterCategory.RangedWeapons) || Equals(filter,ItemFilterCategory.AllItems))) || (Equals(ammoCat,ammoCategory.Attachments) && (Equals(filter,ItemFilterCategory.Attachments) || Equals(filter,ItemFilterCategory.AllItems))) || (Equals(ammoCat,ammoCategory.Consumables) && (Equals(filter,ItemFilterCategory.Consumables) || Equals(filter,ItemFilterCategory.Grenades) || Equals(filter,ItemFilterCategory.AllItems)));
- }
- return wrappedMethod(filter,wrappedData);
- }
- @wrapMethod(CraftingMainLogicController)
- protected func SetupFilters() -> Void{
- let ammoCat=ALSystem.GetConfig().ammoCategorySelected;
- if Equals(ammoCat,ammoCategory.RangedWeapons){ArrayPush(this.m_filters,EnumInt(ItemFilterCategory.RangedWeapons));}else if Equals(ammoCat,ammoCategory.Attachments){ArrayPush(this.m_filters,EnumInt(ItemFilterCategory.Attachments));}else if Equals(ammoCat,ammoCategory.Consumables){ArrayPush(this.m_filters,EnumInt(ItemFilterCategory.Consumables));}
- wrappedMethod();
- }
- @wrapMethod(CraftingDataView)
- public func FilterItem(data:ref<IScriptable>) -> Bool{
- let shouldShow=wrappedMethod(data);
- if shouldShow{return true;}
- let recipeData=data as RecipeData;
- if IsDefined(recipeData){
- let itemType=TweakDBInterface.GetItemRecord(recipeData.id.GetID()).ItemType().Type();
- if !Equals(itemType,gamedataItemType.Con_Ammo){return false;}
- let ammoCat=ALSystem.GetConfig().ammoCategorySelected;
- let currentFilter=this.GetFilterType();
- return (Equals(ammoCat,ammoCategory.RangedWeapons) && (Equals(currentFilter,ItemFilterCategory.RangedWeapons) || Equals(currentFilter,ItemFilterCategory.AllItems))) || (Equals(ammoCat,ammoCategory.Attachments) && (Equals(currentFilter,ItemFilterCategory.Attachments) || Equals(currentFilter,ItemFilterCategory.AllItems))) || (Equals(ammoCat,ammoCategory.Consumables) && (Equals(currentFilter,ItemFilterCategory.Consumables) || Equals(currentFilter,ItemFilterCategory.AllItems)));
- }
- return false;
- }
- // ### AFFICHAGE DES MUNITIONS DANS L’INVENTAIRE ###
- @wrapMethod(UIInventoryItemsManager)
- public final static func GetBlacklistedTags() -> array<CName>{
- let filteredTags=wrappedMethod();
- ArrayRemove(filteredTags,n"Ammo");
- return filteredTags;
- }
- // ### SYSTÈME DE FABRICATION ###
- @wrapMethod(CraftingSystem)
- public final static func GetAmmoBulletAmount(ammoId:TweakDBID) -> Int32{
- let ammoType=ALUtils.GetAmmoTypeFromID(ItemID.FromTDBID(ammoId));
- return !Equals(ammoType,"")?ALDataCache.GetCachedALData(ammoType,ALSystem.GetConfig()).ammoCraft:wrappedMethod(ammoId);
- }
- @wrapMethod(CraftingSystem)
- public final const func GetMaxCraftingAmount(itemData:wref<gameItemData>) -> Int32{
- let itemRecord=TweakDBInterface.GetItemRecord(ItemID.GetTDBID(itemData.GetID()));
- if !itemRecord.TagsContains(n"Ammo"){return wrappedMethod(itemData);}
- let config=ALSystem.GetConfig();
- let ammoData=ALDataCache.GetCachedALData(ALUtils.GetAmmoTypeFromID(itemData.GetID()),config);
- let owner=this.m_playerCraftBook.GetOwner();
- let transactionSystem=GameInstance.GetTransactionSystem(this.GetGameInstance());
- let materialQuantity=transactionSystem.GetItemQuantity(owner,ItemID.FromTDBID(t"Items.CommonMaterial1"));
- let currentQuantity=transactionSystem.GetItemQuantity(owner,itemData.GetID());
- let materialLimit=materialQuantity>=config.craftingCompForAmmo?materialQuantity/config.craftingCompForAmmo:0;
- let ammoLimit:Int32;
- if currentQuantity+ammoData.ammoCraft<=ammoData.limit{ammoLimit=(ammoData.limit-currentQuantity)/ammoData.ammoCraft;}else{ammoLimit=9999;}
- return Max(Min(materialLimit,ammoLimit),0);
- }
- @wrapMethod(CraftingSystem)
- public final const func CanItemBeCrafted(itemData:wref<gameItemData>) -> Bool{
- if !TweakDBInterface.GetItemRecord(ItemID.GetTDBID(itemData.GetID())).TagsContains(n"Ammo"){return wrappedMethod(itemData);}
- let config=ALSystem.GetConfig();
- let ammoData=ALDataCache.GetCachedALData(ALUtils.GetAmmoTypeFromID(itemData.GetID()),config);
- let transactionSystem=GameInstance.GetTransactionSystem(this.GetGameInstance());
- let owner=this.m_playerCraftBook.GetOwner();
- if !this.HasIngredients(this.GetItemCraftingCost(itemData)){return false;}
- if config.strictLimitation{
- let currentQuantity=transactionSystem.GetItemQuantity(owner,itemData.GetID());
- if currentQuantity+ammoData.ammoCraft>ammoData.limit{return false;}
- }
- return true;
- }
- @wrapMethod(CraftingSystem)
- private final func CraftItem(target:wref<GameObject>,itemRecord:ref<Item_Record>,amount:Int32,opt ammoBulletAmount:Int32) -> wref<gameItemData>{
- let isAmmo=itemRecord.TagsContains(n"Ammo");
- if isAmmo{
- let config=ALSystem.GetConfig();
- let ammoType=ALUtils.GetAmmoTypeFromID(ItemID.FromTDBID(itemRecord.GetID()));
- let ammoData=ALDataCache.GetCachedALData(ammoType,config);
- let transactionSystem=GameInstance.GetTransactionSystem(this.GetGameInstance());
- let craftedItemID=ItemID.FromTDBID(itemRecord.GetID());
- transactionSystem.RemoveItemByTDBID(target,t"Items.CommonMaterial1",config.craftingCompForAmmo*amount,true);
- let finalAmmoAmount=amount*ammoData.ammoCraft;
- transactionSystem.GiveItem(target,craftedItemID,finalAmmoAmount);
- this.ProcessCraftSkill(Cast<Float>(TweakDBInterface.GetInt(t"Constants.CraftingSystem.commonIngredientXP",10)*amount));
- let itemData=transactionSystem.GetItemData(target,craftedItemID);
- if IsDefined(itemData){
- this.SetItemLevel(itemData);
- this.MarkItemAsCrafted(itemData);
- }
- this.SendItemCraftedDataTrackingRequest(craftedItemID,finalAmmoAmount);
- return itemData;
- }
- return wrappedMethod(target,itemRecord,amount,ammoBulletAmount);
- }
- // ### SYSTÈME DE PICKER ###
- @wrapMethod(ItemQuantityPickerController)
- private func SetData() -> Void{
- wrappedMethod();
- if IsDefined(this.m_data){
- let itemID=InventoryItemData.GetID(this.m_data.gameItemData);
- if Equals(TweakDBInterface.GetItemRecord(ItemID.GetTDBID(itemID)).ItemType().Type(),gamedataItemType.Con_Ammo){
- let ammoType=ALUtils.GetAmmoTypeFromID(itemID);
- let ammoData=ALDataCache.GetCachedALData(ammoType,ALSystem.GetConfig());
- this.UpdateAmmoDisplay(this.m_data.maxValue,ammoType,ammoData);
- }
- }
- }
- @wrapMethod(ItemQuantityPickerController)
- protected cb func OnSliderValueChanged(sliderController:wref<inkSliderController>,progress:Float,value:Float) -> Bool{
- let result=wrappedMethod(sliderController,progress,value);
- if IsDefined(this.m_data){
- let itemID=InventoryItemData.GetID(this.m_data.gameItemData);
- if Equals(TweakDBInterface.GetItemRecord(ItemID.GetTDBID(itemID)).ItemType().Type(),gamedataItemType.Con_Ammo){
- let ammoType=ALUtils.GetAmmoTypeFromID(itemID);
- this.UpdateAmmoDisplay(Cast<Int32>(value),ammoType,ALDataCache.GetCachedALData(ammoType,ALSystem.GetConfig()));
- }
- }
- return result;
- }
- @wrapMethod(ItemQuantityPickerController)
- protected final func UpdateProgress() -> Void{
- wrappedMethod();
- if IsDefined(this.m_data){
- let itemID=InventoryItemData.GetID(this.m_data.gameItemData);
- if Equals(TweakDBInterface.GetItemRecord(ItemID.GetTDBID(itemID)).ItemType().Type(),gamedataItemType.Con_Ammo){
- let ammoType=ALUtils.GetAmmoTypeFromID(itemID);
- this.UpdateAmmoDisplay(this.m_choosenQuantity,ammoType,ALDataCache.GetCachedALData(ammoType,ALSystem.GetConfig()));
- }
- }
- }
- @addMethod(ItemQuantityPickerController)
- private func UpdateAmmoDisplay(batchCount:Int32,ammoType:String,ammoData:ref<ALData>) -> Void{
- if Equals(ammoType,""){return;}
- let originalName=inkTextRef.GetText(this.m_itemNameText);
- let parenPos=StrFindFirst(originalName," (");
- let cleanName=parenPos>0?StrLeft(originalName,parenPos):originalName;
- inkTextRef.SetText(this.m_itemNameText,cleanName+" ("+IntToString(batchCount*ammoData.ammoCraft)+" "+GetLocalizedTextByKey(n"AmmoLimiter-UI-Total")+")");
- let totalWeight=Cast<Float>(batchCount)*ammoData.ammoWeight*Cast<Float>(ammoData.ammoCraft);
- inkTextRef.SetText(this.m_weightText,FloatToStringPrec(totalWeight,2)+" ("+FloatToStringPrec(ammoData.ammoWeight,3)+" "+GetLocalizedTextByKey(n"AmmoLimiter-UI-Unit")+")");
- }
- // ### SYSTÈME D'AVERTISSEMENT ###
- public static func CheckAndNotifyLowAmmo(player:ref<PlayerPuppet>,weapon:ref<WeaponObject>) -> Void{
- let config=ALSystem.GetConfig();
- if config.ammoLowWarning==0{return;}
- let ammoID=WeaponObject.GetAmmoType(weapon);
- let ammoType=ALUtils.GetAmmoTypeFromID(ammoID);
- if Equals(ammoType,""){return;}
- let ammoData=ALDataCache.GetCachedALData(ammoType,config);
- let warningThreshold=Cast<Int32>(Cast<Float>(ammoData.limit)*Cast<Float>(config.ammoLowWarning)/100.0);
- let transactionSystem=GameInstance.GetTransactionSystem(player.GetGame());
- let currentAmmo=transactionSystem.GetItemQuantity(player,ammoID);
- if currentAmmo<=warningThreshold && currentAmmo>0{
- let ammoName=GetLocalizedTextByKey(TweakDBInterface.GetItemRecord(ItemID.GetTDBID(ammoID)).DisplayName());
- let message=GetLocalizedTextByKey(n"AmmoLimiter-UI-LowAmmoWarning");
- let finalMessage=StrReplace(message,"PROUTS",ammoName);
- let simpleScreenMessage:SimpleScreenMessage;
- simpleScreenMessage.isShown=true;
- simpleScreenMessage.duration=1.2;
- simpleScreenMessage.message=finalMessage;
- simpleScreenMessage.isInstant=true;
- GameInstance.GetBlackboardSystem(player.GetGame()).Get(GetAllBlackboardDefs().UI_Notifications).SetVariant(GetAllBlackboardDefs().UI_Notifications.WarningMessage,ToVariant(simpleScreenMessage),true);
- }
- }
- @wrapMethod(WeaponObject)
- public final static func SendAmmoUpdateEvent(weaponOwner:wref<GameObject>,weapon:wref<WeaponObject>) -> Void{
- wrappedMethod(weaponOwner,weapon);
- let player=weaponOwner as PlayerPuppet;
- if IsDefined(player) && IsDefined(weapon){CheckAndNotifyLowAmmo(player,weapon);}
- }
- @wrapMethod(PlayerPuppet)
- protected cb func OnItemAddedToSlot(evt:ref<ItemAddedToSlot>) -> Bool{
- let result=wrappedMethod(evt);
- if evt.GetSlotID()==t"AttachmentSlots.WeaponRight"{
- let weapon=GameInstance.GetTransactionSystem(this.GetGame()).GetItemInSlot(this,evt.GetSlotID()) as WeaponObject;
- if IsDefined(weapon){CheckAndNotifyLowAmmo(this,weapon);}
- }
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment