//////////////// private (bool IsModified, bool Completed) FillWith(Chest chest, bool removeOnly) { if (WorldGen.genRand.NextFloat() >= this.PercentChance) { //if( !removeOnly ) LogLibraries.LogOnce("1a "+this.PercentChance); return(false, false); } //if( !removeOnly ) LogLibraries.LogOnce("1b "+this.PercentChance); bool isModified = false; ChestFillDefinition self = this; float maxWeight = this.Any .Select(kv => kv.Weight) .Sum(); float weightVal = maxWeight * WorldGen.genRand.NextFloat(); float countedWeight = 0f; foreach ((float weight, ChestFillItemDefinition def) in this.Any) { countedWeight += weight; if (countedWeight < weightVal) { continue; } if (!this.EditNextItem(chest, def, removeOnly)) { //if( !removeOnly ) LogLibraries.LogOnce("2 "+isModified); return(isModified, false); } isModified = true; break; } foreach (ChestFillItemDefinition def in this.All) { if (!this.EditNextItem(chest, def, removeOnly)) { //if( !removeOnly ) LogLibraries.LogOnce("3 "+isModified); return(isModified, false); } isModified = true; } //if( !removeOnly ) LogLibraries.LogOnce("4 "+isModified); return(isModified, true); }
/// <summary> /// Removes the current item(s) from a given chest type, in a given area (if specified). /// </summary> /// <param name="fillDef"></param> /// <param name="chestDef"></param> /// <param name="within"></param> /// <returns>List of modified chests.</returns> public static IList<Chest> RemoveFromWorldChests( ChestFillDefinition fillDef, ChestTypeDefinition chestDef = new ChestTypeDefinition(), Rectangle? within = null ) { var modifiedChestIndexes = new List<Chest>(); foreach( Chest chest in chestDef.GetMatchingWorldChests( within ) ) { (bool isModified, bool completed) status = fillDef.Unfill( chest ); if( status.isModified ) { modifiedChestIndexes.Add( chest ); } } return modifiedChestIndexes; }