Skip to content

⁠ Certain Anomaly psychic rituals not working in multiplayer ⁠ #855

Open

Description

@jcs-png

Description
When performing the Draw Animals, Void Provocation or Draw Shamblers psychic rituals in multiplayer, the ritual completes (bioferrite is consumed, cooldown is applied) but nothing ever spawns on the map. Notification appears but nothing happens. Draw Fleshbeasts works correctly.

Have not tested other rituals, but these have been tested multiple times.

Steps to reproduce
1.⁠ ⁠Host a multiplayer session with at least one other player
2.⁠ ⁠Research and perform the Draw Animals or Draw Shamblers ritual
3.⁠ ⁠Ritual animation completes, bioferrite is consumed, cooldown begins
4.⁠ ⁠Notification appears appears, nothing spawns on the map

Expected behaviour
Animals or shamblers should spawn on the map after the ritual completes.

Actual behaviour
Nothing spawns. The ritual silently fails.

Error from log

PsychicRitualToil Verse.AI.Group.PsychicRitualToil_InvokeHorax threw an exception during Start(): System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.Collections.Generic.List1+Enumerator[T].MoveNextRare () at System.Collections.Generic.List1+Enumerator[T].MoveNext ()
at Verse.AI.Group.PsychicRitualToil_InvokeHorax.HoldRequiredOfferings
at Verse.AI.Group.PsychicRitualToil_InvokeHorax.Start
at Verse.AI.Group.PsychicRitualToilRunner.Start

RimWorld version: 1.6.4633 rev1269

Multiplayer mod version: v0.11.0tacb33a2
I'm aware there is a newer version of the multiplayer mod available but it is currently not working on Mac, so we are running an older version.
NOTE: Latest v0.11.4 does NOT work at all on Mac

Note: These rituals were also tested and confirmed not working prior to the installation of Alpha Animals, Alpha Mechs, and Hospitality, ruling these out as potential causes.
Mod list:

1.6.4633 rev1269
  • zetrith.prepatcher
  • ludeon.rimworld
  • ludeon.rimworld.royalty
  • ludeon.rimworld.ideology
  • ludeon.rimworld.biotech
  • ludeon.rimworld.anomaly
  • ludeon.rimworld.odyssey
  • rwmt.multiplayer
  • rwmt.multiplayercompatibility
  • adaptive.storage.framework
  • oskarpotocki.vanillafactionsexpanded.core
  • vanillaexpanded.vappe
  • vanillaexpanded.varme
  • sarg.alphaanimals
  • sarg.alphamechs
  • vanillaexpanded.vtexe
  • vanillaexpanded.vwe
  • edb.preparecarefully
  • dubwise.dubsmintmenus
  • brrainz.cameraplus
  • crashm.colorcodedmoodbar.11
  • spincrus.dinosauria
  • albion.goexplore
  • telefonmast.graphicssettings
  • krafs.levelup
  • spino.megafauna
  • bp.showbuildablematerialcount
  • co.uk.epicguru.whatsthatmod
  • nandonalt.snowytrees
  • mlie.alphamuffalo
  • oskarpotocki.vfe.medieval2
  • oskarpotocki.vfe.pirates
  • oskarpotocki.vanillafactionsexpanded.settlersmodule
  • orion.hospitality
  • gy.urav
  • ludeon.rimworld.royalty
  • ludeon.rimworld.ideology
  • ludeon.rimworld.biotech
  • ludeon.rimworld.anomaly
  • ludeon.rimworld.odyssey
  • Attached: Full log
    log-rim.txt

    Activity

    1. jcs-png commented on Mar 31, 2026

      @jcs-png
      Author

      Additional finding:
      When switching to async time mode, all previously failed psychic rituals trigger simultaneously on save load. This backlog then re-triggers every time the save is loaded in async mode, even when the events from the previous load are still active on the map.

      This is repeatable and consistent.

    2. jcs-png commented on Mar 31, 2026

      @jcs-png
      Author

      For further testing, converted the save to singleplayer and removed the multiplayer mod. All rituals perform as expected in singleplayer, confirming the issue is specific to the multiplayer mod.

    3. jcs-png commented on Jul 7, 2026

      @jcs-png
      Author

      I've tested this on new games and it is the same.

      Is this just a mac issue?
      As it essentially makes the Entire Anomaly DLC unplayable in multiplayer as you cannot progress through it.

    4. notfood commented on Jul 7, 2026

      @notfood
      Member

      Empty their pockets before they hold the bioferrite, it's a bug in Anomaly DLC Ludeon promised to fix.

      Aside from that, it works fine for me. All of them work.

    5. jcs-png commented on Jul 8, 2026

      @jcs-png
      Author

      @notfood when you say “empty their pockets”, do you mean fully empty their inventory or just utility items like medicine / food / drugs?

      And does that need to be the pawn carrying the bioferrite and performing the ritual?

      Just checking whether that reliably makes rituals like Draw Shamblers / Void Provocation actually fire in multiplayer.

      I’ve not seen this workaround mentioned in the GitHub issues or release notes, so if you’ve tested it successfully, any extra detail would be really helpful.

    6. notfood commented on Jul 9, 2026

      @notfood
      Member

      Yeah, just their medicine/food/drug and if you're using mods to carry weapons, that too.

      Image

      I made a patch that solves this issue but I'm unsure if I should push it.

      /**
       * Method is missing a break in the second foreach loop
       * Original errors if pawn has anything in their inventory
       */
      [HarmonyPatch(typeof(PsychicRitualToil_InvokeHorax), nameof(PsychicRitualToil_InvokeHorax.HoldRequiredOfferings))]
      static class PsychicRitualToil_InvokeHorax_Fix
      {
          static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> insts)
          {
              var target = AccessTools.Method(typeof(ThingOwner), nameof(ThingOwner.TryTransferToContainer),
                  [typeof(Thing), typeof(ThingOwner), typeof(int), typeof(bool)]);
      
              var codes = insts.ToList();
      
              for (var i = 0; i < codes.Count; i++)
              {
                  if (codes[i].operand is MethodInfo method && method == target)
                  {
                      yield return codes[i];
      
                      i++;
      
                      yield return codes[i];
      
                      if (insts.First(i => i.opcode == OpCodes.Leave_S).operand is Label label)
                      {
                          yield return new CodeInstruction(OpCodes.Br_S, label);
                      }
                  }
                  else
                  {
                      yield return codes[i];
                  }
              }
          }
      }
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      No labels
      No labels

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions