Jump to content

Recurrent Crash : Out of tag bits


Kliso
  • Branch: Preview Branch Version: Windows Fixed

Started the game after the holiday update, after a while 600+? cycles, games crashes every so often by "Out of tag bits"

[14:20:52.114] [1] [INFO] Out of tag bits:
Cuprite, GoldAmalgam, IronOre, Wolframite, SedimentaryRock, Dirt, GrilledPrickleFruit, FriedMushroom, SpiceBread, Salsa, Phosphorus, CookedMeat, BasicSingleHarvestPlant, WormPlant, SuperWormPlant, DupeBrain, Alloy, RefinedMetal, Metal, BuildableRaw, BuildableProcessed, Farmable, Organics, Compostable, Seed, Agriculture, Filter, ConsumableOre, Liquifiable, IndustrialProduct, IndustrialIngredient, MedicalSupplies, Clothes, ManufacturedMaterial, Egg, RareMaterials, Other, Edible, CookingIngredient, Medicine, Preserved, GrowingPlant, ReservedByCreature, CreatureBrain, Methane, FieldRation, SwampForagePlant, WormBasicFruit, PrickleFruit, SwampFruit, Lettuce, MushBar, BasicForagePlant, Meat, BasicPlantFood, Ice, IceOre, BuildableAny, Solid, Pickupable, HasChores, Garbage, ToxicSand, PedestalDisplayable, 
Water, AnyWater, Liquid, EggShell, Lime, BabyCrabShell, CrabShell, FriedMushBar, CookedEgg, WormBasicFood, FishMeat, CookedFish, WormSuperFruit, WormSuperFood, BeanPlantSeed, SpiceNut, ColdWheatSeed, Algae, SwampLilyFlower, WoodLog, Fossil, BasicFabric, Rust, Sucrose, SwampDelights, PacuEgg, DivergentWormEgg, PacuCleanerEgg, OilfloaterEgg, CrabEgg, PuftEgg, PuftAlphaEgg, LightBugEgg, StaterpillarEgg, PuftBleachstoneEgg, DivergentBeetleEgg, PacuTropicalEgg, OilfloaterHighTempEgg, SquirrelEgg, DreckoEgg, HatchEgg, PuftOxyliteEgg, DreckoPlasticEgg, LightBugOrangeEgg, HatchVeggieEgg, HatchHardEgg, Fertilizer, Phosphorite, Cool_Vest, Oxygen_Mask, Funky_Vest, BleachStone, Carbon, OxyRock, RefinedCarbon, Salt, Clay, BrineIce, SolidCarbonDioxide, SolidCrudeOil, DirtyIce, Snow, Glass, Steel, 
BasicCure, AluminumOre, Cobaltite, Katairite, Sulfur, Ceramic, Granite, IgneousRock, MaficRock, Obsidian, SandStone, Cobalt, Copper, Iron, SwampLilySeed, CylindricaSeed, PrickleFlowerSeed, SwampHarvestPlantSeed, PrickleGrassSeed, SaltPlantSeed, WormPlantSeed, CactusPlantSeed, WineCupsSeed, BasicSingleHarvestPlantSeed, LeafyPlantSeed, OxyfernSeed, SpiceVineSeed, SeaLettuceSeed, ColdBreatherSeed, Sand, Lead, Diamond, EvilFlowerSeed, Mushroom, ForestTreeSeed, Regolith, ForestForagePlant, PickledMeal, Gold, Warm_Vest, ColdWheatBread, MushroomSeed, Atmo_Suit, BasicFabricMaterialPlantSeed, Polypropylene, SurfAndTurf, CritterTrapPlantSeed, BulbPlantSeed, Aluminum, CrushedIce, TableSalt, ToePlantSeed, SolidChlorine, SolidNaphtha, SlimeMold, CompostSwampDelights, Mud, ToxicMud, RotPile, PlantMeat, Plumbable, Crushable, Stored, StoredPrivate, 
Unstable, PreciousRock, DivergentWorm, DivergentWormBaby, Deliverable, StaterpillarBaby, Staterpillar, PuftOxylite, PuftOxyliteBaby, DreckoBaby, Drecko, DreckoPlasticBaby, DreckoPlastic, Hatch, HatchBaby, OilfloaterHighTempBaby, OilfloaterHighTemp, Glom, Squirrel, SquirrelBaby, Puft, PuftAlpha, PuftBaby, PuftAlphaBaby, HatchVeggie, HatchVeggieBaby, LightBug, LightBugBaby, Oilfloater, OilfloaterBaby, PuftBleachstone, PuftBleachstoneBaby, HatchHard, HatchHardBaby, LightBugOrange, LightBugOrangeBaby, DivergentBeetle, DivergentBeetleBaby, CrabBaby, Crab, Mutatable, CropSeed, DirtyWater, LiquidSource, SaltWater, Brine, Petroleum, CrudeOil, Ethanol, Naphtha, Chlorine, Magma, Coal, Oxygen, Gas, Breathable, Mixture, Hydrogen, Unbreathable, FlyingCritterEdible, Oxidizer, Life, Walker, Creature, 
BagableCreature, Plant, HasDebugDestination, PlayInterruptAnim, Falling, Poop, Hungry, WantsToEat, Fertile, WantsToGetRanched, WantsToGetCaptured, Antiseptic, Plastic, CombustibleGas, Sealed, CombustibleLiquid, Insulator, Fullerene, Isoresin, BuildingFiber, Minion, Decor20, Reachable, Pacu, SwimmingCreature, Swimmer, Flopping, Wild, PerformingWorkRequest, Overjoyed, NoOxygen, WantsToBurrow, WantsToTendPlants, SwampHarvestPlant_0, PacuCleanerBaby, SleepBehaviour, CallAdultBehaviour, ColdWheat_0, DecorSeed, CactusPlant_0, WormPlant_0, LeafyPlant_0, ColdBreather_0, Ore, Transparent, SwampLily_0, SpiceVine_0, CrabFriend, Amphibious, PrickleGrass_0, BasicSingleHarvestPlant_0, PrickleFlower_0, Flyer, Submerged, PacuBaby, Cylindrica_0, WantsToPlantSeed, WantsToClimbTree, ForestTree_0, ScalesGrown, BuildingWood, WaterSeed, BasicFabricPlant_0, AirtightSuit, 
Suit, Pickled, WineCups_0, IncubatableEgg, PacuTropicalBaby, Idle, PacuTropical, PrickleFlower, Wilting, Oxyfern_0, EvilFlower_0, Radium, SwampHarvestPlant, BulbPlant, BulbPlant_0, Decoration, SuperWormPlant_0, LiquidCarbonDioxide, BasicFabricPlant, LightSource, BeanPlant_0, SaltPlant_0, SpiceVine, Hanging, PrickleGrass, EmittingDisease, BeanPlant, Oil, CarbonDioxide, CactusPlant, SeaLettuce_0, ToePlant_0, CritterTrapPlant, CritterTrapPlant_0, HasSuitTank, Confined, MushroomPlant_0, MushroomPlant, Hoverer, EmitsLight, Expecting, Overcrowded, PreventChoreInterruption, ForestTreeBranch, ForestTreeBranch_0, SeaLettuce, Assigned, ForestTree, AlwaysConverse, Burrowed, WantsToExitBurrow, Asleep, GrowUpBehaviour, Drowning, LeafyPlant, SwampLily, InIncubator, Bagged, Die, WantsToProducePower, WineCups, Stunned, Entombed, ContaminatedOxygen, 


version:  EX1-445987
not using any mods
 

Intergalactic Committee Cycle 919.sav

Player.log


Steps to Reproduce

Load the save, play for a while (doesn't take long)




User Feedback


A developer has marked this issue as fixed. This means that the issue has been addressed in the current development build and will likely be in the next update.

was able to continue my game by patching TagBits struct in the game assembly to add an extra storage for tag bits (bits6), increasing the tag limit to 448, 5-6 hours of playtime without any crash so far

 

using System;
using System.Collections.Generic;

// Token: 0x020000FE RID: 254
public struct TagBits
{
	// Token: 0x06000870 RID: 2160
	public TagBits(ref TagBits other)
	{
		this.bits0 = other.bits0;
		this.bits1 = other.bits1;
		this.bits2 = other.bits2;
		this.bits3 = other.bits3;
		this.bits4 = other.bits4;
		this.bits5 = other.bits5;
		this.bits6 = other.bits6;
	}

	// Token: 0x06000871 RID: 2161
	public TagBits(Tag tag)
	{
		this.bits0 = 0UL;
		this.bits1 = 0UL;
		this.bits2 = 0UL;
		this.bits3 = 0UL;
		this.bits4 = 0UL;
		this.bits5 = 0UL;
		this.bits6 = 0UL;
		this.SetTag(tag);
	}

	// Token: 0x06000872 RID: 2162
	public TagBits(Tag[] tags)
	{
		this.bits0 = 0UL;
		this.bits1 = 0UL;
		this.bits2 = 0UL;
		this.bits3 = 0UL;
		this.bits4 = 0UL;
		this.bits5 = 0UL;
		this.bits6 = 0UL;
		if (tags != null)
		{
			foreach (Tag tag in tags)
			{
				this.SetTag(tag);
			}
		}
	}

	// Token: 0x06000873 RID: 2163
	public List<Tag> GetTagsVerySlow()
	{
		List<Tag> tags = new List<Tag>();
		this.GetTagsVerySlow(0, this.bits0, tags);
		this.GetTagsVerySlow(1, this.bits1, tags);
		this.GetTagsVerySlow(2, this.bits2, tags);
		this.GetTagsVerySlow(3, this.bits3, tags);
		this.GetTagsVerySlow(4, this.bits4, tags);
		this.GetTagsVerySlow(5, this.bits5, tags);
		this.GetTagsVerySlow(6, this.bits6, tags);
		return tags;
	}

	// Token: 0x06000874 RID: 2164
	private void GetTagsVerySlow(int bits_idx, ulong bits, List<Tag> tags)
	{
		for (int local_flag_idx = 0; local_flag_idx < 64; local_flag_idx++)
		{
			if ((bits & 1UL << local_flag_idx) > 0UL)
			{
				int global_flag_idx = 64 * bits_idx + local_flag_idx;
				tags.Add(TagBits.inverseTagTable[global_flag_idx]);
			}
		}
	}

	// Token: 0x06000875 RID: 2165
	private static int ManifestFlagIndex(Tag tag)
	{
		int flag;
		int result;
		if (TagBits.tagTable.TryGetValue(tag, out flag))
		{
			result = flag;
		}
		else
		{
			flag = TagBits.tagTable.Count;
			TagBits.tagTable.Add(tag, flag);
			TagBits.inverseTagTable.Add(tag);
			DebugUtil.Assert(TagBits.inverseTagTable.Count == flag + 1);
			if (TagBits.tagTable.Count >= 448)
			{
				string error_msg = "Out of tag bits:\n";
				int used = 0;
				foreach (KeyValuePair<Tag, int> kvp in TagBits.tagTable)
				{
					error_msg = error_msg + kvp.Key.ToString() + ", ";
					used++;
					if (used % 64 == 0)
					{
						error_msg += "\n";
					}
				}
				Debug.LogError(error_msg);
			}
			result = flag;
		}
		return result;
	}

	// Token: 0x06000876 RID: 2166
	public void SetTag(Tag tag)
	{
		int flag_idx = TagBits.ManifestFlagIndex(tag);
		if (flag_idx < 64)
		{
			this.bits0 |= 1UL << flag_idx;
			return;
		}
		if (flag_idx < 128)
		{
			this.bits1 |= 1UL << flag_idx;
			return;
		}
		if (flag_idx < 192)
		{
			this.bits2 |= 1UL << flag_idx;
			return;
		}
		if (flag_idx < 256)
		{
			this.bits3 |= 1UL << flag_idx;
			return;
		}
		if (flag_idx < 320)
		{
			this.bits4 |= 1UL << flag_idx;
			return;
		}
		if (flag_idx < 384)
		{
			this.bits5 |= 1UL << flag_idx;
			return;
		}
		Debug.LogWarning("Saved tag in bits6: " + tag.Name);
		this.bits6 |= 1UL << flag_idx;
	}

	// Token: 0x06000877 RID: 2167
	public void Clear(Tag tag)
	{
		int flag_idx = TagBits.ManifestFlagIndex(tag);
		if (flag_idx < 64)
		{
			this.bits0 &= ~(1UL << flag_idx);
			return;
		}
		if (flag_idx < 128)
		{
			this.bits1 &= ~(1UL << flag_idx);
			return;
		}
		if (flag_idx < 192)
		{
			this.bits2 &= ~(1UL << flag_idx);
			return;
		}
		if (flag_idx < 256)
		{
			this.bits3 &= ~(1UL << flag_idx);
			return;
		}
		if (flag_idx < 320)
		{
			this.bits4 &= ~(1UL << flag_idx);
			return;
		}
		if (flag_idx < 384)
		{
			this.bits5 &= ~(1UL << flag_idx);
			return;
		}
		this.bits6 &= ~(1UL << flag_idx);
	}

	// Token: 0x06000878 RID: 2168
	public void ClearAll()
	{
		this.bits0 = 0UL;
		this.bits1 = 0UL;
		this.bits2 = 0UL;
		this.bits3 = 0UL;
		this.bits4 = 0UL;
		this.bits5 = 0UL;
		this.bits6 = 0UL;
	}

	// Token: 0x06000879 RID: 2169
	public bool HasAll(ref TagBits tag_bits)
	{
		return (this.bits0 & tag_bits.bits0) == tag_bits.bits0 && (this.bits1 & tag_bits.bits1) == tag_bits.bits1 && (this.bits2 & tag_bits.bits2) == tag_bits.bits2 && (this.bits3 & tag_bits.bits3) == tag_bits.bits3 && (this.bits4 & tag_bits.bits4) == tag_bits.bits4 && (this.bits5 & tag_bits.bits5) == tag_bits.bits5 && (this.bits6 & tag_bits.bits6) == tag_bits.bits6;
	}

	// Token: 0x0600087A RID: 2170
	public bool HasAny(ref TagBits tag_bits)
	{
		return ((this.bits0 & tag_bits.bits0) | (this.bits1 & tag_bits.bits1) | (this.bits2 & tag_bits.bits2) | (this.bits3 & tag_bits.bits3) | (this.bits4 & tag_bits.bits4) | (this.bits5 & tag_bits.bits5) | (this.bits6 & tag_bits.bits6)) > 0UL;
	}

	// Token: 0x0600087B RID: 2171
	public bool AreEqual(ref TagBits tag_bits)
	{
		return tag_bits.bits0 == this.bits0 && tag_bits.bits1 == this.bits1 && tag_bits.bits2 == this.bits2 && tag_bits.bits3 == this.bits3 && tag_bits.bits4 == this.bits4 && tag_bits.bits5 == this.bits5 && tag_bits.bits6 == this.bits6;
	}

	// Token: 0x0600087C RID: 2172
	public void And(ref TagBits rhs)
	{
		this.bits0 &= rhs.bits0;
		this.bits1 &= rhs.bits1;
		this.bits2 &= rhs.bits2;
		this.bits3 &= rhs.bits3;
		this.bits4 &= rhs.bits4;
		this.bits5 &= rhs.bits5;
		this.bits6 &= rhs.bits6;
	}

	// Token: 0x0600087D RID: 2173
	public void Or(ref TagBits rhs)
	{
		this.bits0 |= rhs.bits0;
		this.bits1 |= rhs.bits1;
		this.bits2 |= rhs.bits2;
		this.bits3 |= rhs.bits3;
		this.bits4 |= rhs.bits4;
		this.bits5 |= rhs.bits5;
		this.bits6 |= rhs.bits6;
	}

	// Token: 0x0600087E RID: 2174
	public void Xor(ref TagBits rhs)
	{
		this.bits0 ^= rhs.bits0;
		this.bits1 ^= rhs.bits1;
		this.bits2 ^= rhs.bits2;
		this.bits3 ^= rhs.bits3;
		this.bits4 ^= rhs.bits4;
		this.bits5 ^= rhs.bits5;
		this.bits6 ^= rhs.bits6;
	}

	// Token: 0x0600087F RID: 2175
	public void Complement()
	{
		this.bits0 = ~this.bits0;
		this.bits1 = ~this.bits1;
		this.bits2 = ~this.bits2;
		this.bits3 = ~this.bits3;
		this.bits4 = ~this.bits4;
		this.bits5 = ~this.bits5;
		this.bits6 = ~this.bits6;
	}

	// Token: 0x06000880 RID: 2176
	public static TagBits MakeComplement(ref TagBits rhs)
	{
		TagBits result = new TagBits(ref rhs);
		result.Complement();
		return result;
	}

	// Token: 0x04000612 RID: 1554
	private static Dictionary<Tag, int> tagTable = new Dictionary<Tag, int>();

	// Token: 0x04000613 RID: 1555
	private static List<Tag> inverseTagTable = new List<Tag>();

	// Token: 0x04000614 RID: 1556
	private const int Capacity = 448;

	// Token: 0x04000615 RID: 1557
	private ulong bits0;

	// Token: 0x04000616 RID: 1558
	private ulong bits1;

	// Token: 0x04000617 RID: 1559
	private ulong bits2;

	// Token: 0x04000618 RID: 1560
	private ulong bits3;

	// Token: 0x04000619 RID: 1561
	private ulong bits4;

	// Token: 0x0400061A RID: 1562
	private ulong bits5;

	// Token: 0x0400061B RID: 1563
	public static TagBits None = default(TagBits);

	// Token: 0x040029EA RID: 10730
	private ulong bits6;
}

 

 

Edited by Kliso

Share this comment


Link to comment
Share on other sites

15 hours ago, alantangyl said:

Where is this file and how can i modify and compile it to run the game?

I have the same error

Assembly-CSharp-firstpass.dll

this is the patched file for version EX1-445987

placed in 
\steamapps\common\OxygenNotIncluded\OxygenNotIncluded_Data\Managed

- any update will most likely remove the patch
- i haven't noticed anything but there might be some side effect (so not report further bugs if you are using the patched file)
- it might break the compatibility of the save with further official updates

Use at your own risk

to remove the patch simply verify the integrity of game files on steam

  • Like 1

Share this comment


Link to comment
Share on other sites

While that will probably work, distributing that file is against the EULA and probably illegal, and triggers a thing in the game that stops it from actually reporting errors, so you'd never be able to report errors that are unrelated.

Share this comment


Link to comment
Share on other sites

Just want to add that I had the same issue and the new dll saved my base. Before it was crashing every odd cycle. Now I let it run over night and in the morning still no crash.

  • Big Ups 1

Share this comment


Link to comment
Share on other sites

I've been having hte same issue after about 250 cycles on multiple run throughs. So I'm going to try the above file despite the junior lawyers advice otherwise. :)

Share this comment


Link to comment
Share on other sites

Changed Status to Fixed

We noticed quite a few in-game reports for this crash. In the next update the TagBits will be increased by two to create some buffer room for mods as well.

  • Thanks 4

Share this comment


Link to comment
Share on other sites



Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
  • Create New...