Skip to content

Pickups Integrations

This folder contains optional integration bridges for the Pickups system.

These integrations allow Pickups to interact with other RevFramework systems without the Pickups runtime assembly depending on any of them. Each bridge is a separate, define-gated assembly that references the other system directly — so removing the folder removes the dependency, and keeping it keeps the contract compile-checked.

These integrations are built and supported for RevFramework systems only. They are not intended as a general integration layer for third-party solutions.


What This Folder Is

Each subfolder represents a specific system integration, for example:

  • CurrencyIntegration/ → currency adjustments via pickups
  • HealthIntegration/ → healing, regen, and health-based gating
  • InventoryIntegration/ → item grants via inventory services

👉 These are extensions, not part of the core Pickups runtime.


How Integrations Work

All integrations follow the same principles:

Soft Dependencies

  • No direct assembly references from the Pickups runtime to other systems
  • Each integration lives in its own assembly, gated on both systems' REV_*_PRESENT defines, and references the other system directly and by type
  • Services are located through that system's own typed resolver — CurrencyResolve.ServiceFrom(...), InventoryResolve.ServiceFrom(...) — or through a typed component lookup such as GetComponentInParent<IHealthReadonly>()

👉 This keeps Pickups fully modular and removable: delete the folder and the Pickups runtime is untouched. It is the assembly boundary doing that work, not indirection at the call site.

No reflection

There is none anywhere under Integrations/Pickups. An earlier GiveCurrencyEffect did reflect over type names and method verbs, and it failed silently on every path — the effect had always done nothing. Direct typed calls turn that class of failure into a compile error.


Explicit Opt-In

  • Integrations do not activate automatically
  • You must:

  • include the integration folder

  • use the provided definitions/effects
  • or call integration-specific factory entrypoints

👉 Nothing is injected or globally overridden.


Resolution Failure Is Reported, Not Swallowed

Integrations resolve the target system's service at runtime, per apply.

If resolution fails, or the service refuses:

  • The effect applies nothing and returns false
  • An Editor warning is logged naming the reason and the fix
  • No runtime exceptions are thrown

GiveCurrencyEffect and GiveItemEffect both implement IPickupEffectReportsDelivery, so that false reaches the caller. A TriggerPickup reading it leaves itself in the world instead of destroying itself — which is what stops a payload being consumed without ever being received.


Important

These are optional

  • Pickups works without any integrations
  • You only need these if you want cross-system behaviour

No lock-in

  • You are not required to use these integrations
  • You can:

  • replace them

  • extend them
  • or build your own

👉 These are examples of how to integrate RevFramework systems, not required dependencies.


Behaviour depends on target systems

Each integration calls a real contract on the other system:

  • Currency → ICurrencyService.Credit/Debit(GameObject, CurrencyId, Money)
  • Inventory → IInventoryService.GiveExact(GameObject, ItemStack, string)
  • Health → IHealthWriter, IHealthReadonly on the actor's damageable

These are compile-time references, so a contract that moves breaks the build rather than the game. What can still fail at runtime is resolution: if no service is present in the scene, the effect reports a refusal instead of applying.


Third-Party / Custom System Use

These integrations are built for RevFramework systems only.

If you are integrating Pickups with non-RevFramework systems:

  • Treat these integrations as reference examples
  • Implement your own bridge or adapter
  • Use the public APIs of each system

👉 Custom or third-party integrations are not supported by this layer.


Intended Usage

Use these integrations when you want to:

  • Connect Pickups to other RevFramework systems
  • Prototype cross-system behaviour quickly
  • Understand how systems interact without coupling

👉 Then adapt or replace them for your own project.


Safe to Remove

This entire folder is optional.

Removing it will:

  • Not affect the Pickups runtime system
  • Only remove cross-system behaviour

Summary

This folder answers:

“How do I connect Pickups to other RevFramework systems without coupling them together?”

It provides:

  • Optional integration bridges
  • Soft-linked system interaction
  • Clear extension patterns

Use them as reference implementations — not as required dependencies.