You are viewing a potentially older version of this package. View all versions.
pacoito-itolib-0.8.0 icon

itolib

[v73] Wondrous gizmos and gadgets for the restless mind.

Date uploaded 6 days ago
Version 0.8.0
Download link pacoito-itolib-0.8.0.zip
Downloads 21053
Dependency string pacoito-itolib-0.8.0

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2304 icon
BepInEx-BepInExPack

BepInEx pack for Mono Unity games. Preconfigured and ready to use.

Preferred version: 5.4.2304
IAmBatby-LethalLevelLoader-1.6.5 icon
IAmBatby-LethalLevelLoader

A Custom API to support the manual and dynamic integration of all forms of custom content in Lethal Company. (v73 Compatible)

Preferred version: 1.6.5

README

itolib

Thunderstore Downloads GitHub Releases License

Wondrous gizmos and gadgets for the restless mind.


A collection of wacky scripts I've written for projects I'm involved in, most prominently Bozoros and PlayZone.

Everything's kept fairly abstract so it can be generally applied for many use cases. Feel free to add this to your project to play around with, if anything catches your eye!

  • NOTE: Expect a few breaking changes here and there (at least while everything is being polished), should you choose to add this as a dependency.

  • NOTE 2: This is not intended to be a JLL replacement and follows a pretty different design philosophy, though there are several overlapping features. It should be fine to use both libraries in the same project without issues, however.

Features (but here's the yapper)

A proper write-up and documentation for all components and their intended usage is planned, but here's a quick rundown of them all:

  • PlayerAttachable: An abstract effect or concept that continually affects a player (attach), and eventually stops (detach).
    • PlatformGrabbable: Physically attaches a player and makes them 'grab' on to a 'platform', making the player's position follow said platform's until either a certain action stops being held (e.g. Jump), or they are detached through some other means. Used for Bozoros' balloon rides and PlayZone's slides.
    • PlayerElectrode: Drains the batteries of any attached player's held and/or pocketed items, at a configurable rate.
    • PlayerHinderer: Slows down any player who attaches in a similar way to the vanilla spider web, up until the moment they detach. Has options to act as quicksand and sink the player (as long as the Collider underneath it has an appropriate tag), with a few customizable traits. Players can also be inflicted with the TZP 'drunk' effect, at a configurable rate. Used for PlayZone's ball pit.
    • PlayerLauncher: Launches any player who attaches, with heavily customizable trajectory parameters, and some additional optional features like fall damage prevention (until detached) and camera/player model tilting. Used for Bozoros' banana peels and PlayZone's trampolines.
    • PlayerSeater: Makes any player who attaches enter a sitting animation until detaching, without reparenting the player or having to use an InteractTrigger. Used for PlayZone's slides.
    • PlayerTracker: Physically attaches to a player and follows them around, at a configurable speed. Has an optional list of Transform 'pivots' to rotate to look towards the target, also at configurable speeds.
    • PlayerWeightEvent: An event that has a chance to be invoked periodically, with the chance being dependant on the attached player's weight.
    • MovementSensor: Checks if the attached player performs a specific movement action (e.g. Jump, Move, Crouch), and invokes an event callback if so. A cooldown can be applied so as to not trigger continuously, which can even be used for things like fake custom footstep sound effects. Used for PlayZone's ball pit movement effects.
      • ShotgunSensor: 'Detects' a shotgun being fired by an attached player towards the target, and invokes an event callback if it meets the (configurable) parameters for both range and precision.
      • SpraySensor: 'Detects' spray paint being used by an attached player towards the target. Has various thresholds for number of sprays required before invoking an event. Also works with weed killer!
  • DetectRegion: An abstract region within which to detect or perform (non-allocating) searches for overlapping Collider instances belonging to objects of a certain type.
    • EnemySensor: Detects any enemies inside, entering, and/or exiting the region, with some additional filtering for whitelisting specific enemies, as well as requiring a certain amount of them before triggering events.
    • HazardSensor: Detects any objects in the MapHazards layer inside the region, with an additional function to despawn found hazards.
    • PlayerSensor: Detects any players inside, entering, and/or exiting the region, with some additional event callbacks specifically filtering players that are alive.
    • ScrapSensor: Detects any scrap inside, entering, and/or exiting the region, with some additional functions for causing them to drop to the ground, or disable its MeshRenderer and/or Collider instances.
    • ExplodeEffect: Implementation of vanilla's Landmine.SpawnExplosion using DetectRegion, which performs non-allocating searches inside a Collider (instead of a radius), contains some additional customizability for explosion properties, and has an adjustable collision mask to define which layers should count as 'cover' from the explosion.
    • VehicleSensor: Detects any vehicles inside, entering, and/or exiting the region.
    • ConnectorMerger: (Niche) Detects any instances of itself within the region, disables one of them and (optionally) moves the remaining one to the center. Has a priority system so certain connectors are preferred from others.
  • ItemGrabbable: A GrabbableObject but with a bunch of event callbacks that can mimic an inheriting class (e.g. SoccerBallProp) without actually inheriting it, sacrificing polymorphism for modularity. All these components can be mixed and matched to create items with multiple properties (e.g. ItemKickable + ItemThrowable to make a throwable soccer ball).
    • ItemAudible: Mimics NoisemakerProp, with pretty much the same properties save for a few additional ones.
    • ItemDiscardable: Adds discardability to any item, allowing it to be forcibly dropped from a player's inventory, and (optionally) despawned.
    • ItemKickable: Mimics SoccerBallProp, with some added customizability for kick trajectory parameters, event callbacks, and an adjustable collision mask for objects it can land on top of.
    • ItemThrowable: Mimics StunGrenadeItem, with some added customizability for throw trajectory parameters, event callbacks, and an adjustable collision mask for objects it can land on top of.
    • ItemWearable: Mimics BeltBagItem's wearable properties, specifically 'attaching' to either the player's head, belt, or a custom bone when pocketed.
    • ItemWhackable: Mimics Shovel, with added customizability for its properties (e.g. hit cooldown or hit speed), event callbacks for every stage of the 'whacking' process, and adjustable collision masks for hittable objects, with the added bonus of not allocating GC on every swing.
    • EventfulApparatus: A LungProp but with all the event callbacks from ItemGrabbable, plus a few Apparatus-related ones. Allows selectively customizing which parts of the Apparatus sequence are actually triggered (e.g. showing the alert without shutting off power).
      • ActivateApparatus: Can automatically activate an Apparatus at the start of the round, so only a single deactivated prefab is needed for it. EventfulApparatus already includes this functionality, this is just for when a standard LungProp is preferred.
  • Interactables: Various InteractTrigger-related components.
    • InteractClimbable: An InteractTrigger for a ladder with adjustable climbing speed.
    • InteractLockable: A DoorLock implementation that allows custom tooltips that don't get overwritten when using a key. Doesn't inherit from InteractTrigger but is used alongside them for locked doors.
    • InteractPurchasable: An InteractTrigger that can invoke an event, but for a fee.
    • InteractSeatable: An InteractTrigger that acts like a Cruiser seat, but requiring a specific button press to get back up.
      • NOTE: Can be replaced with PlayerSeater for functionally the same effect, without the vanilla bug where two players get softlocked if they sit down at the same time.
    • InteractTalkable: An InteractTrigger that can transmit a player's voice over the Walkie while held; though only for one-way communication.
  • Events: Assortment of various events invoked in different ways.
    • ApparatusEvent: An event that gets invoked after an Apparatus gets pulled by a player.
    • DelayedEvent: An event that gets invoked after a specified amount of time, either continuously or only once (until re-enabled).
    • HourEvent: An event that gets invoked at a certain time of the day, when the hour changes (while enabled).
    • ToggleEvent: An event that simply has two states that can be toggled, and is synced across clients.
    • WeightedEvent: Invokes an event (or several) from a specified list, each with its own weighted chance of being picked.
    • ScriptableEvent: A ScriptableObject that can define an arbitrary 'global' event that can be invoked from any event callback, as long as their parameters match.
      • ScriptableEventListener: Can be used in combination with a ScriptableEvent to create an arbitrary 'global' event. This event can be raised from within any other event callback, to trigger something to happen on another, completely detached object.
  • NetworkedSpawner: An abstract spawner for NetworkObject types, with a lot of varying customizability for the spawns.
    • EnemySpawner: Can spawn one or many instances of either a specific enemy type (that can be switched), or various enemy types randomly picked using a weighted list.
      • EnemyAnnihilator: Not a spawner at all, but can be used alongside an EnemySpawner or EnemySensor to create 'temporary' enemies that will eventually die (e.g. after a certain amount of time passes, or after a player interacts with something). Also has some functions for dealing damage to enemies.
    • HiveSpawner: Can spawn one or many beehives at specific (exact) locations, with options to override scrap value, scan node text and parameters, as well as which type of item should actually be used as a 'hive'.
    • PrefabSpawner: Can spawn one or many instances of a (registered) network prefab at specific locations.
      • ScriptableNetworkPrefab: A ScriptableObject that includes a list of objects to register as network prefabs at the start of the game, in order for them to be spawned by PrefabSpawner without registering through other means. Needs to be manually added to a bundle that loads at the start of the game (e.g. an ExtendedMod bundle).
    • ScrapSpawner: Can spawn one or many instances of various item types randomly picked using a weighted list, with options for overriding minimum and maximum scrap values, scrap multiplier being applied, and several other things. Items are able to be spawned at exact positions and rotations (e.g. a Shovel buried in the ground), as long as fallToGround is disabled. Has the option of using the current moon's scrap weights (in addition to the weighted list) for item selection.
      • GiftSpawner: Can spawn one or many instances of the vanilla GiftBoxItem, with their contents being randomly picked using a weighted list, instead of being dependant on spawn position. Has options for overriding minimum and maximum scrap values for the item inside, sound and particle effects played when opening the gift, scan node text and parameters for the gift, and the material used for the gift.
      • ScrapTeleporter: (Niche) Moves existing scrap items from the current round to specified locations. Alternative to spawning scrap items, if creating additional items is not desired.
    • Fish: 🐟.
  • NetworkedHittable: An abstract object that implements IHittable, and can thus be hit.
    • DamageHittable: A hittable object with a specified amount of health, which can invoke events depending on various health thresholds (e.g. upon reaching 0 health). Also doubles as a generic counter script, if abstracting what 'getting hit' means.
    • PhysicsHittable: A hittable object that can apply a force to a Rigidbody upon being hit, with force depending on the damage dealt and direction depending on where it was hit from.
  • NetworkedAlert: An abstract alert message that can be displayed to any or all players.
    • AlertDialogue: Displays one or several dialogue alert messages to players (e.g. 'ship leaving early' alert).
    • AlertNotification: Displays one or several notification alerts to players (e.g. 'new creature data' alert).
    • AlertSignal: Displays one or several Signal Translator message to players, which can go over the vanilla letter limit.
    • AlertToast: Displays one or several toast alerts to players (e.g. 'dropship items missed' alert).
  • BaseConditional: An abstract list of overrides that depend on a specific condition to be applied.
    • ContentConditional: Performs searches of a specific type of content (e.g. an item, enemy, or even a plugin), and invokes an event if they exist and are loaded.
    • DungeonConditional: Performs a search of the current dungeon's name in a list of override entries to apply, and invokes the events of any that match.
    • MoonConditional: Performs a search of the current moon's name in the a list of override entries to apply, and invokes the events of any that match.
    • WeatherConditional: Performs a search of the current weather's name in a list of override entries to apply, and invokes the events of any that match. Compatible with weather being changed mid-round by WeatherRegistry (through WeatherTweaks) or CrowdControl.
  • ComponentGroup: Groups of components of a specific type (collected dynamically), to simply call functions in bulk for them all.
    • AudioGroup: A group of multiple AudioSource components, for performing audio operations (e.g. pausing and unpausing) to each of them all.
    • RigidbodyGroup: A group of multiple Rigidbody components, for applying a force of a certain type (e.g. ForceMode.Impulse) to each of them all.
      • RandomVector: Simply outputs a random Vector3 within a specified range to an event callback, where it can be used by other scripts (e.g. RigidbodyGroup). Has functions for modifying the minimum and maximum values for each axis, if so desired.
  • Animations:
    • AnimationParamSetter: Targets a specific Animator parameter (that can be switched) to allow setting its value from an event call, while also syncing said value across clients.
    • AnimationVelocity: Can set a float parameter in an Animator to use as a speed multiplier for an AnimationClip, allowing smoothly changing between speed values and syncing it across clients.
    • ConnectedRope: Similar to the vanilla SetLineRendererPoints script (used when the Cruiser is being delivered), except allowing more than just two points, and also able to handle the LineRenderer having useWorldSpace disabled.
    • MultiAnimationEvent: Similar to the vanilla PlayAudioAnimationEvent script, except only its event callback (everything else it offers can be handled through other scripts instead), of which there can be multiple defined within the same component.
  • Effects:
    • AttachedEffect: (Niche) A particle effect or sound GameObject with object pooling capabilities, instances of which can be assigned to specific objects to play effects simultaneously.
    • FearInducer: Inflicts fear upon a player's soul! Works like a player's DeadBodyInfo (triggers fear effect when looked at), but has various customizable parameters (e.g. cooldown, max distance, angle, and amount of fear relative to distance).
    • MaterialSwapper: Can perform one or multiple material swaps for specified objects and their children, if a given keyword is found in the names of the materials of each Renderer.
    • NetworkedSource: An AudioSource but with networking capabilities, so all clients can hear it being played. Has a few additional configurable parameters, including whether sounds made by it should alert enemies or not.
    • PlayerOuchie: Deals damage to a player, with some customizable parameters.
    • SpookyDefog: Removes interior 'Halloween Fog' introduced in v67, if enabled for the current round.
    • SunScreen: (Niche) Disables the sun's renderer when entering the facility (if the moon has one), for 'open' interiors that would otherwise have the sun visible. Doubles as an event for players entering and exiting the facility, too.
  • Other:
    • CeilingAdjuster: (Niche) Moves an object to the highest point in the current dungeon generation.
    • EventfulStoryLog: A vanilla StoryLog but with a few added event callbacks (e.g. when a player collects it, or when it tries spawning while having already been collected).
    • DungeonTelevision: A vanilla TVScript that works when inside the facility, instead of immediately shutting itself off. Works even if most fields (e.g. all VideoClip and Material ones) are left blank to reduce bundle size, since they get replaced with the values present in the vanilla prefab. Also compatible with TVLoader, as long as there's no TV playing in the ship.
    • HazardReplacer: (Niche) Can 'replace' a vanilla SpawnableMapObject by copying its AnimationCurve for the current moon over to another added through ExtendedDungeonFlow at the start of the round. Relies on the vanilla SpawnableMapObject not being present in any of the RandomMapObject spawners for the interior, so it's a bit wonky in its implementation.
    • OutOfBoundsAdjuster: (Niche) Lowers the current moon's OutOfBoundsTrigger to the lowest point in the current dungeon generation, allowing for extremely vertical interiors without having to worry about intersecting it.
      • NOTE: This functionality exists in ExtendedDungeonFlow since LethalLevelLoader v1.6.0, with the EnableDynamicOutOfBoundsTrigger field. This script is only kept here for backwards compatibility.
    • ReverbTriggerAdjuster: (Niche) Can adjust, replace, or disable any AudioReverbTrigger present in the ship scene (SampleSceneRelay), which would otherwise be inaccessible from the moon side of things.
      • NOTE: Should be careful with its use, since some of the triggers that can be replaced or disabled might be doing something important...
    • SaneReverbTrigger: An AudioReverbTrigger but with a customizable delay per activation, instead of running every frame. Also has an option to trigger only upon entering it.
    • SpecificDoorway: A Doorway with the option of specifying whether it can be picked as an entrance, exit, or neither while generating the dungeon, in order to have more than just one to choose from. Also has options for modifying their weights, which can increase or lower their chances of being picked to generate a path.
      • NOTE: The first tile generated by the dungeon needs to have a SpecificDoorway for them to apply everywhere else.

A lot of these scripts can be quite niche, and may require further explanation to employ properly. If you're curious about any of them and/or have any questions regarding usage of a particular script, I've kept my commit messages fairly lengthy when adding new scripts, but also feel free to ping me in the Lethal Company Modding Discord server. Feedback, suggestions, and bug reports are also welcome!

Credits

  • The LC Modding Community β€” For support, ideas, encouragement, and just good vibes in general.
  • LethalMatt β€” For Bozoros, my all-time favorite moon (I am not biased at all...), but also for coming up with wacky concepts for PlayZone that necessitated additional scripting functionality, which was then added to this library.
  • IAmBatby β€” For LethalLevelLoader, the backbone for a significant chunk of custom content for this game. A couple scripts in here also require it or make use of its features.
  • PF1MIL β€” For Early Accessβ„’ testing of various scripts, suggesting additions and improvements, and just generally waiting patiently for this library to release.
  • You! β€” alt

CHANGELOG

Changelog

[v0.8.0]

Added a few more alert scripts and an event, did several other small tweaks and fixes.

  • Updated README to actually include nearly all components in the library.
    • 50+ previously unlisted ones were added, along with a short description of their intended usage.
  • Added ApparatusEvent, which simply invokes an event callback when an Apparatus is pulled by a player.
  • Added AlertToast, which can display a toast message to players (e.g. dropship items missed alert).
  • Added AlertNotification, which can display a notification message to players (e.g. new creature data alert).
  • Added AlertSignal, which can display a signal translator message to players that can go over the vanilla letter cap.
  • Made AlertDialogue inherit from the more abstract NetworkedAlert, just like the other alerts.
  • Made NetworkedHittable and ItemWhackable's weapon hitID fields a dropdown selection instead of a number value.
  • Made PlayerOuchie's player body ragdoll field a dropdown selection instead of a number value.
  • Fixed PlayerSeater not resetting player animation state after sitting down (again).
  • Readded a renamed (now deprecated) field to ScrapSpawner, for some backwards compatibility.
  • Added a temporary hotfix for Berunah (from Wesley's Moons).
    • Fixed error spam due to a leftover testing Camera.
  • Made various other small additions and improvements.

[v0.7.0]

Added various scripts and features, fixed a couple issues, removed some deprecated/legacy stuff.

  • Added ContentConditional, for doing stuff that depends on certain modded content existing, or a specific plugin being found.
  • Added PlayerWeightEvent, which periodically checks a player's weight to determine if it should trigger or not.
  • Added ShakeEffect, which just triggers a screen shake effect for the local client.
    • Might swap it to something that inherits from PlayerSensor at some point.
  • Added VehicleSensor, for checking if the Cruiser is inside, entering and/or exiting a region.
    • Will eventually add some bonus functions for doing stuff to the Cruiser (like applying force or dealing damage).
  • Added ReverbTriggerAdjuster, to tweak certain AudioReverbTriggers not normally accessible from the moon scene.
    • Can adjust, replace, or disable AudioReverbTriggers present in the ship scene (SampleSceneRelay).
    • Should be careful with its use, since some of the triggers that can be replaced or disabled might be doing something important...
  • Added SyncedSpawn activation time, to trigger scripts right before SpawnSyncedObjects begin their spawning.
  • Added onConditionalFail to BaseConditional-inheriting scripts, which is called whenever the match in question fails.
  • Added material overrides to GiftSpawner, which can be used to replace the gift's texture when spawned.
    • Also made it so multiple overrides can be selected for the gift's poof particle and opening sound effect.
  • Changed ScrapSpawner's moon scrap spawns field to add the scraps instead of completely overriding the weights.
  • Changed ScrapSpawner's onSpawnPerformed to be called only until after the scrap item has finished being initialized and synced.
  • Changed BaseConditional-inheriting scripts to no longer stop after the first match, to continue applying other overrides.
    • Will likely add a field for this, in case cascading overrides are not desired.
  • Changed OutOfBoundsAdjuster to not exit early after finding a kill trigger, in case the current moon has multiple for whatever reason.
  • Renamed DungeonStoryLog to EventfulStoryLog, for it is no longer limited to just interiors.
  • Fixed some issues with IWeightedScript-inheriting scripts when manually adding or modifying weights.
  • Fixed ScriptableEvents with the same GUID not actually referring to the same instance.
  • Fixed MoonConditional not matching moons properly due to a string-related issue.
  • Fixed TwinApparatus shutting off power for good after only one being pulled.
  • Fixed ScrapSpawner's onSpawnPerformed callback only being called for the host.
  • Fixed ScrapSensor's onRegionEntered and onRegionExited callbacks only working for the host (probably).
  • Removed a couple deprecated fields and scripts:
    • Removed deprecated ActivationTime field for the scripts that had it.
    • Removed obsolete (extra) AudioGroup script.
  • Removed PlatformUnstable script, since its functionality can be recreated using other, more abstract scripts.

[v0.6.1]

Some small optimizations and tweaks.

  • Made ConnectedRope no longer allocate GC every frame...
  • Removed some tag comparisons that weren't really needed.
  • Added caching for the various WaitFor yield statements in Coroutines.
  • Fixed original hives replaced by HiveSpawner still being able to be struck by lightning despite being deactivated.
  • Made required components auto-assign the component in question to its relevant field (though there's not that many).
  • Updated a few internal project dependencies.

[v0.6.0]

Bunch of script reworks, some rather niche additions, a couple fixes.

  • Added ScriptableNetworkPrefab, for registering one or several network prefabs from the editor.
    • Allows usage of PrefabSpawner for moons without manually registering prefabs.
    • A bit impractical to use at the moment, though...
  • Added abstract ComponentGroup, for scripts that perform bulk actions with several components.
    • Made a separate AudioGroup that inherits from ComponentGroup, and deprecated the current one.
    • Added RigidbodyGroup, for applying force to several Rigidbodies at the same time.
  • Added RandomVector, which just produces a random Vector within a set range and passes it onto an event to do stuff with on demand.
  • Deprecated usage of blank references in NetworkedSpawner scripts to define what to spawn in favor of just item/enemy/prefab names.
    • Avoids potential issues with blank references being deleted by LethalLevelLoader after being replaced (as it's intended to), and I was already doing name comparisons to begin with.
    • Blank references in spawners will still work but will be removed at some point in the future.
  • Added separate field for EnemySpawner to spawn a single specific enemy.
    • Will override any set weighted enemy spawns, but allows switching the enemy to spawn through a method.
  • Added option to immediately stop any spawned scrap's AudioSource components from playing audio after being spawned, to help a bit with potential missing sound issues.
    • Looking at you, Dine scraps...
  • Added separate event callbacks to NetworkedSpawner for when the player has performed a hit using a Shovel or Knife specifically.
  • Added methods for attaching a player or any transform to the start or end of a ConnectedRope.
  • Added method to set InteractPurchasable's interactable state.
  • Internal tweaks to weighted scripts.
    • Added (default) function to IWeightedScript to add one or several weight entries to an already-initialized list of weights.
    • Added functions to the IWeightedScript-inheriting scripts to add and remove weights.
  • Improved WeatherConditional handling of WeatherTweaks' combined and progressing weathers a lot.
    • Notably now allows matching combined/progressing weathers with custom names, such as ones added through Custom Weathers Toolkit.
  • Added an extra check to ScrapSensor to double check the item's spawned.
  • Removed temporary hotfix for Abaddon (from Nightmare Moons), for it has been fixed.

[v0.5.1]

Added a new script, did a couple networking-related hotfixes.

  • Added AlertDialogue, for sending dialogue messages to the player.
    • Uses the 'ship leaving early' UI to display messages.
    • Has a few customization options like sound effect override and (optional) delay between letters.
    • Several dialogue entries can be specified to display several messages, in sequence.
  • Fixed PlayerAttachable not detaching clients properly over the network.
    • Also fixed some possible weirdness with despawning.
  • Removed Netcode patching step from plugin initialization.

[v0.5.0]

Updated for v73 and above; reworked ScriptableEvent, added a couple new scripts and some small features.

  • Updated library dependencies for v73, including Unity and NetcodePatcher versions.
    • NOTE: This release is not backwards-compatible with v72 and below, and downgrading to an older release is required to play on prior versions of the game.
  • Made a few internal networking tweaks and improvements using the new Rpc attribute.
  • Added ConnectedRope, for attaching a LineRenderer to several different points.
    • Similar to the game's SetLineRendererPoints, but for more than two points.
  • Reworked ScriptableEvent and ScriptableEventListener.
    • Now uses a key system instead of a direct reference, and can thus handle being included in multiple bundles.
    • Added comments and tooltips to both of them.
  • Added periodic stamina draining to PlayerHinderer.
    • Drain speed can be adjusted, as well as whether to take carry weight into account or not.
  • Added resetOnToggle field for DelayedEvent, to determine whether the timer should reset when the script is disabled, or if it should be paused until re-enabled.
  • Added a missing null check to EventfulApparatus.
  • Added a small hotfix for Abaddon (from Nightmare Moons).
    • Fixed error spam due to a missing NavMeshObstacle.
    • Temporary fix since the moon cannot be updated at the moment.
  • Added Fish.

[v0.4.6]

Actually updated CHANGELOG this time...

  • I forgor to update the CHANGELOG for v0.4.5.

[v0.4.5]

Added a new script, a couple new features, refactored some activation-related stuff.

  • Added PlayerElectrode, for handling the draining of a player's chargeable items.
    • Held and/or pocketed items can be periodically drained (like active Flashlights), or manually drained by a percentage amount.
  • Added drunkness (TZP) effect to PlayerHinderer.
    • Speed of the effect being applied to the player is configurable, and can be set to a high amount to immediately max out the effect.
    • Also added a separate field to disable slowing the player down, in case only the other PlayerHinderer features are needed.`
  • Added a function to HazardSensor to deactivate (via Terminal code) any found hazards.
  • Reworked all scripts that activate at a specified time to use the IActivationScript interface.
    • This includes AnimationVelocity, AudioGroup, BaseConditional (and its inheriting scripts), DetectRegion (and its inheriting scripts), MaterialSwapper, NetworkedSpawner (and its inheriting scripts), ScrapTeleporter, ToggleEvent, and WeightedEvent.
    • Should be backwards-compatible, but re-serializing any prefabs that use them (by saving the prefab) is recommended.
  • Corrected some comments and tooltips here and there.

[v0.4.4]

Added a new sensor, did some other small things, fixed Doorway stuff (again).

  • Added ShotgunSensor, for detecting if the object is shot at by a player using a Shotgun.
    • Works by using the same principles as SpraySensor, so it also doesn't hook into any actual ShotgunItem code.
    • Will likely add compatibility with modded ranged weapons at some point, too.
  • Added event callback to IEventfulItem for reacting to being placed on a DepositItemsDesk.
  • Added a few comments and tooltips to ItemGrabbable, but it's not fully done yet.
  • Fixed SpecificDoorway not working properly, but actually this time...
  • Removed some networking stuff from PlatformGravity that wasn't doing anything, since PlayerPhysicsRegions are not NetworkBehaviours.

[v0.4.3]

Readded a small fix I undid by accident.

  • Fixed PlayerSeater erroring out for clients other than the player sitting down.

[v0.4.2]

Added a new spawner, fixed a couple things.

  • Added GiftSpawner, for spawning (rigged) vanilla presents.
    • Item inside the gift can be randomly selected from a weighted list.
    • Minimum and maximum scrap values for the item inside the gift can be overridden.
    • Gift opening audio and poof particle can be overridden, too!
  • Fixed PlayerSeater breaking player sitting under certain circumstances.
    • Now actually checking if the player is in a special animation before setting the SA_stopAnimation trigger.
  • Fixed SpecificDoorway not actually working properly...

[v0.4.1]

Added a few comments and tooltips, fixed some incompatibilities and minor bugs, did a bit of refactoring and tweaking.

  • Added comments and tooltips for all types that inherit PlayerAttachable.
    • Also corrected some erroneous and/or outdated tooltips.
  • Added some fields to configure camera clamping for PlayerSeater.
    • Players are also now teleported to the intended seat position, instead of relying on other means (e.g. PlatformGrabbable) to reposition them.
    • Tooltips for items are now properly hidden when hiding a player's held item, too.
  • Added (basic) support for ScrapSpawner and EnemySpawner spawning items and enemies added through DawnLib.
    • Only does a name comparison, will likely add namespace searching and tag matching at some point in the near future.
  • Made it so if a player action is not found for whatever reason (e.g. for MovementSensor), it'll throw a warning and disable the script instead of spamming errors.
    • Also maybe fixed not being able to find the player action in the first place, though I haven't been able to reproduce this issue so I can't confirm.
  • Made range parameter for SpraySensor and FearInducer a floating point number instead of an integer.
  • Fixed error thrown in ScrapSensor when a scrap item entered (or was created inside) the region before being spawned.
  • Fixed WeatherConditional compatibility with the latest CrowdControl versions.
  • Fixed SpecificDoorway incompatibility with Loadstone.
    • Changed how specificDoorwayActive is toggled to not depend on PauseBetweenRooms being greater than zero.
  • Fixed ToggleEvent not syncing properly between clients.

[v0.4.0]

Added a couple new spawners, several useful fields and methods, some small fixes; also did some internal refactoring for a few scripts.

  • Added EnemySpawner, to spawn any number of specified enemies on demand.
  • Added HiveSpawner, for spawning Circuit Bees at specific locations.
    • Has fields to override the scrap item that bees consider to be their hive, modify the scan nodes for both the bees and hive, and scale hive scrap value depending on its distance from the ship.
  • Added EnemyAnnihilator, to queue up the killing of any given enemies.
    • Intended for 'temporary' enemies that despawn after a certain amount of time, but can also simply be used for general enemy killing.
    • Can employ EnemySpawner's onSpawnPerformed callback to add enemies to the list, as well as EnemySensor's enemy filters to kill specific enemies that enter a region.
  • Added fields to EventfulApparatus to toggle pretty much every step of the Apparatus pulling sequence (e.g. playing particle effects, flickering lights, waking up Old Birds).
  • Added some fields to NetworkedSpawner to include every AINode (inside and/or outside) in the list of spawn locations.
    • Also added a field to include the children of any specified spawn locations as well.
  • Added function to EnemySensor for setting a given enemy's NavMeshAgent speed to 0 for one second, to semi-reliably handle any pathfinding changes for fast-moving enemies (e.g. disabling a NavMeshObstacle or OffMeshLink).
    • Warps the enemy to the beginning of any OffMeshLink they may be traveling through right as they are stopped.
    • Will probably end up being moved to its own dedicated EnemyHinderer script at some point.
  • Added function to sync playback time for every AudioSource in an AudioGroup, as well as a field to automatically 'initialize' them all (Play() followed by Pause()).
  • Added a networked AttachPlayer() function to PlayerAttachable, instead of only having AttachPlayerLocal() available for manual attaching.
  • Rewrote NetworkedSpawner-inheriting scripts to use NetworkLists to sync spawned object properties with all clients, instead of periodically checking if they have spawned for the local client.
  • Improved ISeededScript interface and implemented it on all scripts that use randomization.
  • Reworked ToggleEvent and added networking to it, to properly sync toggling across clients.
  • Reworked HourEvent to subscribe to TimeOfDay's onHourChanged event, instead of only checking the time after being enabled.
  • Fixed ExplodeEffect throwing errors if used while in orbit, due to a null check I forgor.
  • Fixed OutOfBoundsAdjuster not adjusting the kill floor on moons that deviate from a vanilla hierarchy a bit.
  • Fixed two-handed ItemWhackable items being able to be pocketed, if scrolling during the swinging animation.
  • Removed prefab spawning stuff in InteractPurchasable, as it can be handled better via PrefabSpawner.
  • Removed AudioSource and Animator stuff from PlatformGrabbable, as it can be handled better through other means.
  • Removed (unused) ContentTag-related fields in ScrapSpawner.
    • Will likely re-add tag spawning at some point, but it's been unused since the addition of weighted scrap spawning.

[v0.3.2]

Small fix for NetworkedHittable, added LayerMask fields to a couple scripts.

  • Fixed NetworkedHittable objects erroring out when hit by a non-player.
  • Added a LayerMask field to both SpraySensor and FearInducer, which determine the layers that should block the player's line of sight.

[v0.3.1]

Couple small improvements and fixes.

  • Added ISeededScript interface, for scripts that need randomization using the current map seed.
    • Only used for ScrapSpawner at the moment, still thinking about a few things with its implementation.
  • Made ScrapSpawner's respectSingleItemDay field actually work, and made its seededRandom field affect a couple things I missed.
  • Added default curves for ItemKickable and ItemThrowable that correspond with the Soccer ball and Stun grenade curves, respectively.
  • Made ItemTargetable's fall curve override be reset upon being picked up, so items don't act weird when normally dropped.
  • Switched to using an AABB check of the local player for PlayerSensor, if the onlyAffectsLocalPlayer field is enabled.
    • Most likely will end up switching to AABB checks for all players at some point, instead of overlap stuff.
  • Fixed DetectRegion scripts sometimes 'remembering' objects that had been previously found, but are no longer present.

[v0.3.0]

Did a couple changes, I think...

  • Added SpraySensor, for detecting if the object is being sprayed with Spray Paint, Weed Killer, or any other item that uses or inherits SprayPaintItem.
    • Multiple spray 'treshholds' can be defined, each with event callbacks, to have stuff happen depending on the number of times sprayed (e.g. to have something happen after 3 sprays specifically).
    • Does not actually hook into any SprayPaintItem code, so it should be compatible with anything that modifies it (e.g. BetterSprayPaint).
  • Added FearInducer, which increases a player's fear level and plays the fear effect when looked at.
    • Has some customizability for things like range, angle, and amount of fear to instill upon the player depending on how close they are.
    • Disables itself after triggering once, but can be re-enabled to give the player another spook.
  • Added ItemDiscardable, for items that drop themselves from the player's inventory.
    • Has a function to cause the item to drop itself from the player's inventory (even while pocketed), as well as a despawn timer after getting discarded.
  • Added EventfulApparatus, a LungProp-inheriting object with a bunch of events similar to ItemGrabbable.
    • (PlayZone) TwinApparatus now inherits from EventfulApparatus.
  • Added MultiAnimationEvent, which is similar to PlayAudioAnimationEvent but without a few features that can be done in a better way with other components (e.g. with NetworkedSource), and with a list of event callbacks to execute instead of the single OnAnimationEvent.
  • Added AudioGroup, which checks objects and their children for any AudioSource, and allows some basic audio functions to be run on all sources at once.
  • Added CeilingAdjuster, which just raises whichever object it's attached to to the highest point in the dungeon + a specified additional offset.
  • Added DungeonConditional, for doing stuff whenever specific interiors generate.
  • Added lerping to PlayerLauncher, so it smoothly ramps up towards the applied force instead of immediately applying it.
    • Ramping speed is adjustable, and it comes with a new detach condition for once the force is fully applied.
    • Also fixed the unintended rocket jump whenever players jump right before touching the PlayerLauncher, but it can be turned back on!
  • Added lerping to PlatformGrabbable, to smoothly move the player towards the center of the platform, instead of teleporting them to it.
    • Not teleporting instantly means the player will be slightly behind the intended position, but this grabbing speed can be adjusted.
  • Added IEventfulItem interface, which includes every event available in ItemGrabbable.
    • Made all modular item scripts (e.g. ItemWhackable) require using items that implement the IEventfulItem interface.
    • Made ItemGrabbable and EventfulApparatus implement IEventfulItem, so they're both compatible with all modular item scripts!
  • Added abstract ItemTargetable, which represents items that follow a trajectory towards a set destination.
    • ItemKickable and ItemThrowable now both inherit from it, and thus share some common functionality.
    • Both ItemKickable and ItemThrowable had some revisions done to their trajectory logic, too.
  • Added IWeightedScript interface, which includes a bunch of default method implementations to handle weighted randomization.
    • WeightedEvent and ScrapSpawner now implement said interface.
  • Added generics to the IPooledObject interface.
    • Now the abstract PooledObject contains Unity-related object pooling stuff, and AttachedEffect inherits from it.
    • It also now actually supports creating a given number of instances to have ready from the start.
  • Overhauled ScrapSpawner a bit (using the IWeightedScript interface):
    • Added a weighted list of items to spawn, instead of just a single item.
      • Blank references (even for modded items!) should be working correctly, too.
    • Added field to ScrapSpawner to allow it to use the current moon's spawn weights, instead of specifying a list.
      • Overrides any items set in the weighted list.
    • Added a minimum and maximum set amount of items to spawn, instead of simply spawning one at every defined location.
    • Added able to spawn scrap at a random location within specified area bounds, instead of only at set points.
    • Made spawned scrap actually count towards the current round's total scrap value amount.
  • Added pretty much all ItemAudible fields to NetworkedSource, and improved its networking a bit.
    • NetworkedSource now has functionality to, for instance, alert nearby enemies or play sounds over the walkie.
  • Made MaterialSwapper able to do a set amount of swaps per activation, instead of doing all of them at once.
    • Allows for 'cycling' through various material states by only doing a certain number at a time.
  • Improved enemy filtering for EnemySensor.
    • Added callback events for individual filters, as well as enemy blacklisting.
  • Added GrabbableObject attaching to AttachedEffect.
    • Switched AttachedEffect generic type to Collider, and made it detach upon disabling.
  • Added a sitting animation field to PlayerSeater, to be able to use the sofa and electric chair sitting animations, too.
  • Added a stamina requirement field for triggering MovementSensor events.
  • Added a player stamina draining function to PlayerHinderer.
  • Added field to mute quicksand sinking sounds for PlayerHinderer.
  • Added a networked onLogCollected event callback to DungeonStoryLog.
  • Made DetectRegion scripts take (lossy) scale into account when performing searches.
  • Made InteractClimbable's specialCharacterAnimation field automatically disable itself, if twoHandedItemAllowed is enabled.
    • Allows players to climb with two-handed items.
  • Merged WallBreaker script into ConnectorMerger, which can now be used to disable either connector, or both.
  • Fixed PlayerSensor player search counting players twice.
  • Fixed ExplodeEffect explosion spawning a fair distance away from where it was actually supposed to.
    • Also fixed its spawnExplosionEffect field not actually doing anything.
  • Fixed all BaseConditional scripts not applying on dungeon completion.
  • Fixed PrefabSpawner not working without the spawner itself being spawned.
    • But who spawns the spawner?
  • Fixed NetworkedHittable not actually serializing hitID and the player who hit when sending hit information to other clients.
  • Fixed sun not actually being hidden by the SunScreen script.
    • Switching spectating camera also no longer toggles the sun, but I don't think it was even working in the first place...
  • Fixed detachTimer field for PlayerAttachable not actually starting when manually attaching the player (instead of with attachOnEnter).

[v0.2.0]

Did some pretty substantial refactoring; added and fixed a couple things, too.

  • Added some stuff to ExplodeEffect:
    • Made ExplodeEffect able to target any object that implements the IHittable interface.
    • Added separate enemy and IHittable curves to ExplodeEffect, to deal specific damage to non-player targets.
    • Replaced damageRange and killRange with damageBounds and killBounds, for visualization purposes.
  • Added player sinking curve overriding to PlayerHinderer, to control how deep the player actually sinks before dying.
  • Added OutOfBoundsAdjuster, which just moves the current moon's OutOfBoundsTrigger to the lowest point in the dungeon + a specified additional offset.
    • Intended for more vertically-oriented dungeons.
  • Made DetectRegion actually take region rotation into account when performing searches.
  • Did a lot of refactoring under the hood, based on IAmBatby's suggestions and feedback!
    • Made scripts with update loops disable themselves when not in use, the most important one being PlayerAttachable.
    • Removed all uses of null propagation on UnityObject stuff, fixing some rare NullReferenceException errors.
    • Switched from using NetworkObjectReferences to NetworkBehaviourReferences when networking stuff, thus skipping a step.
    • Some other miscellaneous tweaks and fixes here and there.

[v0.1.4]

Reworked PlayerLauncher a bit, fixed WeatherRegistry compatibility.

  • PlayerLauncher now uses a list of forces to apply to the player, to combine multiple sources of rotation (e.g. where the launcher is facing + where the player's looking towards).
  • Added some drowning/quicksand-related stuff to PlayerHinderer, but it's not quite working just yet...
  • Fixed WeatherConditional compatibility with WeatherRegistry, I forgor to actually apply my patch for it...

[v0.1.3]

Added player callbacks to NetworkedHittable, fixed some stuff with WeightedEvent.

  • Added information to NetworkedHittable about the player that performed the hit, as well as some separate hit event callbacks with said player given as an invoke parameter.
  • WeightedEvent rolls should now actually roll when initiated by clients.

[v0.1.2]

Added DamageHittable and ToggleEvent, fixed some stuff with scrap-related scripts.

  • DamageHittable is a NetworkedHittable with health, it's got a list of conditions with event callbacks that are invoked when its health falls to or below specified numbers.
  • ToggleEvent is just a behaviour with event callbacks for OnEnable() and OnDisable()... there ain't much more to it, I just needed it for something.
  • ScrapSpawner should actually sync scrap position now, I forgor to add it...
  • ScrapTeleporter now uses a seeded Random instance, takes teleport area colliders' center point into account, and should properly set item rotations if set to activate on scrap spawn (as it was supposed to have been doing).

[0.1.1]

Added some compatibility for PizzaTowerEscapeMusic.

  • Pulling only one TwinApparatus will no longer trigger escape music.

[0.1.0]

Initial release!

  • Documentation is lacking for most scripts and there's a good amount of jank, but it should be stable enough for a release.
  • Proper documentation and wiki pages for all features is planned, alongside some example prefabs used in Bozoros and PlayZone.