Little Utilities, Arms Reach for door, journal, stairways, token, ecc.
This project is born like a upgrade of the project Arms Reach ty to psyny, in preparation of foundry vtt 0.8.0, but after a while i put some feature here and there and now i got something a little more complex.
I'll try to make this module system indipendent , but if anyone has some rule distance computation for a specific system i can put some more settings for manage that.
It's always easiest to install modules from the in game add-on browser.
To install this module manually:
https://raw.githubusercontent.com/p4535992/foundryvtt-arms-reach/master/src/module.json
This module uses the libWrapper library for wrapping core methods. It is a hard dependency and it is recommended for the best experience and compatibility with other modules.
A little api to use in macro cc. for check if the placeable object reachable with variant based on the string id or the string tag from the module tagger
.
The api is reachable from the variable game.modules.get('arms-reach').api
or from the socket libary socketLib
on the variable game.modules.get('arms-reach').socket
if present and active.
boolean
Calculate the distance between the source token and the target placeable objet
Returns: boolean
- The boolean value for tell if the target is near enough to the source token
Param | Type | Description |
---|---|---|
token | Token |
The source token |
placeableObject | placeableObject |
The target placeable object |
maxDistance | number |
OPTIONAL: explicit distance (units or grid) to check |
useGrid | boolean |
OPTIONAL: if true it will explicit calculate the grid distance instead the unit distance |
userID | string |
OPTIONAL: user id for the distance checking |
Example:
game.modules.get('arms-reach').api.isReachable(token: Token, placeableObject: PlaceableObject, maxDistance?: number, useGrid?: boolean, userId?: string):boolean
boolean
Calculate the distance between the source token and the first target placeable objet with a specific tag, the method 'isReachableByTag' need the Tagger Module installed and active for work.
Returns: boolean
- The boolean value for tell if the first target with the specific tag is near enough to the source token
Param | Type | Description |
---|---|---|
token | Token |
The source token |
tag | string |
The tag from the Tagger Module to check for start the distance calculation |
maxDistance | number |
OPTIONAL: explicit distance (units or grid) to check |
useGrid | boolean |
OPTIONAL: if true it will explicit calculate the grid distance instead the unit distance |
userID | string |
OPTIONAL: user id for the distance checking |
Example:
game.modules.get('arms-reach').api.isReachableByTag(token: Token, tag: string, maxDistance?: number, useGrid?: boolean, userId?: string): boolean
boolean
Calculate the distance between the source token and the target placeable objet
Returns: boolean
- The boolean value for tell if the target is near enough to the source token
Param | Type | Description |
---|---|---|
token | Token |
The source token |
placeableObjectId | string |
The target placeable object id reference |
maxDistance | number |
OPTIONAL: explicit distance (units or grid) to check |
useGrid | boolean |
OPTIONAL: if true it will explicit calculate the grid distance instead the unit distance |
userID | string |
OPTIONAL: user id for the distance checking |
Example:
game.modules.get('arms-reach').api.isReachableById(token: Token, placeableObjectId: string, maxDistance?: number, useGrid?: boolean, userId?: string): boolean
boolean
Calculate the distance between the source token and the target placeable objet
Returns: boolean
- The boolean value for tell if the target is near enough to the source token
Param | Type | Description |
---|---|---|
token | Token |
The source token |
placeableObjectIdOrName | placeableObject |
The target placeable object id or name or label or entry reference |
maxDistance | number |
OPTIONAL: explicit distance (units or grid) to check |
useGrid | boolean |
OPTIONAL: if true it will explicit calculate the grid distance instead the unit distance |
userID | string |
OPTIONAL: user id for the distance checking |
Example:
game.modules.get('arms-reach').api.isReachableByIdOrName(token: Token, placeableObjectIdOrName: string, maxDistance?: number, useGrid?: boolean, userId?: string): boolean
boolean
Calculate the distance between the source token and the target placeable objet
Returns: boolean
- The boolean value for tell if the target is near enough to the source token
Param | Type | Description |
---|---|---|
token | Token |
The source token |
placeableObject | placeableObject |
The target placeable object |
maxDistance | number |
OPTIONAL: explicit distance (units or grid) to check |
useGrid | boolean |
OPTIONAL: if true it will explicit calculate the grid distance instead the unit distance |
userID | string |
OPTIONAL: user id for the distance checking |
Example:
game.modules.get('arms-reach').api.isReachableUniversal(placeableObject: PlaceableObject, placeableObject: PlaceableObject, maxDistance?: number, useGrid?: boolean, userId?: string):boolean
boolean
Calculate the distance between the source token and the first target placeable objet with a specific tag, the method 'isReachableByTag' need the Tagger Module installed and active for work.
Returns: boolean
- The boolean value for tell if the first target with the specific tag is near enough to the source token
Param | Type | Description |
---|---|---|
placeableObject | placeableObject |
The source placeableobject |
tag | string |
The tag from the Tagger Module to check for start the distance calculation |
maxDistance | number |
OPTIONAL: explicit distance (units or grid) to check |
useGrid | boolean |
OPTIONAL: if true it will explicit calculate the grid distance instead the unit distance |
userID | string |
OPTIONAL: user id for the distance checking |
Example:
game.modules.get('arms-reach').api.isReachableByTagUniversal(placeableObject: PlaceableObject, tag: string, maxDistance?: number, useGrid?: boolean, userId?: string): boolean
boolean
Calculate the distance between the source token and the target placeable objet
Returns: boolean
- The boolean value for tell if the target is near enough to the source token
Param | Type | Description |
---|---|---|
placeableObject | placeableObject |
The source placeableobject |
placeableObjectId | string |
The target placeable object id reference |
maxDistance | number |
OPTIONAL: explicit distance (units or grid) to check |
useGrid | boolean |
OPTIONAL: if true it will explicit calculate the grid distance instead the unit distance |
userID | string |
OPTIONAL: user id for the distance checking |
Example:
game.modules.get('arms-reach').api.isReachableByIdUniversal(placeableObject: PlaceableObject, placeableObjectId: string, maxDistance?: number, useGrid?: boolean, userId?: string): boolean
boolean
Calculate the distance between the source token and the target placeable objet
Returns: boolean
- The boolean value for tell if the target is near enough to the source token
Param | Type | Description |
---|---|---|
placeableObject | placeableObject |
The source placeableobject |
placeableObjectIdOrName | placeableObject |
The target placeable object id or name or label or entry reference |
maxDistance | number |
OPTIONAL: explicit distance (units or grid) to check |
useGrid | boolean |
OPTIONAL: if true it will explicit calculate the grid distance instead the unit distance |
userID | string |
OPTIONAL: user id for the distance checking |
Example:
game.modules.get('arms-reach').api.isReachableByIdOrNameUniversal(placeableObject: PlaceableObject, placeableObjectIdOrName: string, maxDistance?: number, useGrid?: boolean, userId?: string): boolean
You can use the socketLib for call the same functions:
await game.modules.get('arms-reach').socket.executeAsGM('isReachable', token: Token, placeableObject: PlaceableObject, maxDistance?: number, useGrid?: boolean, userId?: string):Promise
await game.modules.get('arms-reach').socket.executeAsGM('isReachableByTag', token: Token, tag: string, maxDistance?: number, useGrid?: boolean, userId?: string): Promise
await game.modules.get('arms-reach').socket.executeAsGM('isReachableById', token: Token, placeableObjectId: string, maxDistance?: number, useGrid?: boolean, userId?: string): Promise
await game.modules.get('arms-reach').socket.executeAsGM('isReachableByIdOrName', token: Token, placeableObjectIdOrName: string, maxDistance?: number, useGrid?: boolean, userId?: string): Promise
NOTE: for now the optional parameter 'userId' is not used from the api, i hope to add in the future some filter so a specific actor for a specific user has some limitation.
The interaction distance is measure by the distance between a token and a placeable object like door, journal, stairways, ecc.
To interact with a door, journal, ecc., the player need to have a token selected (or own a token) for make the calculation distance working well
Enable the GM to select the maximum distance that players can interact with a door (needs a token selected) (DM bypass this limitation)
Pressing 'e' opens/closes a door nearest of current selected token
NOTE: If no token is selected and you are a GM this feature is not activated
npm install
dev
will let you develop you own code with hot reloading on the browser
npm run dev
build
will build and set up a symlink between dist
and your dataPath
.
npm run build
build:watch
will build and watch for changes, rebuilding automatically.
npm run build:watch
prettier-format
launch the prettier plugin based on the configuration here
npm run-script prettier-format
lint
launch the eslint process based on the configuration here
npm run-script lint
lint:fix
launch the eslint process with the fix argument
npm run-script lint:fix
build:json
unpack LevelDB pack on src/packs
to the json db sources in src/packs/_source
very useful for backup your items and manually fix some hard issue with some text editor
npm run-script build:json
build:clean
clean packs json sources in src/packs/_source
. NOTE: usually this command is launched after the command build:json
and after make some modifications on the json source files with some text editor, but before the build:db
npm run-script build:clean
build:db
packs the json db sources in src/packs/_source
to LevelDB pack on src/packs
with the new jsons. NOTE: usually this command is launched after the command build:json
and after make some modifications on the json source files with some text editor
npm run-script build:db
Any issues, bugs, or feature requests are always welcome to be reported directly to the Issue Tracker, or using the Bug Reporter Module.
This package is under an MIT license and the Foundry Virtual Tabletop Limited License Agreement for module development.
Thanks to anyone who helps me with this code! I appreciate the user community's feedback on this project!
Foundry VTT discord community for always helping me out.
Arms Reach Original ty to psyny
foundryvtt-stairways ty to SWW13
drag-ruler ty to manuelVo
range-overlay ty to Nazrax
A very big thanks to manuelVo, because i was to stupid to understand thing like measurement of Foundry by myself. A very big thanks to Saibot393, and his GeometricUtils class for token distance calculation.