Showing preview only (5,919K chars total). Download the full file or copy to clipboard to get everything.
Repository: damian-pastorini/reldens
Branch: master
Commit: e4a1d2f5d78a
Files: 991
Total size: 5.4 MB
Directory structure:
gitextract__red38cn/
├── .claude/
│ ├── client-camera-follow-system.md
│ ├── commands-reference.md
│ ├── entities-reference.md
│ ├── environment-variables.md
│ ├── feature-modules.md
│ ├── guest-system-technical-guide.md
│ ├── installer-guide.md
│ ├── items-system-implementation.md
│ ├── player-state-flow.md
│ ├── room-data-optimization.md
│ ├── room-images-tileset-override-flow.md
│ ├── stat-bars-configuration.md
│ ├── storage-architecture.md
│ ├── trade-system-implementation.md
│ └── ui-visibility-configuration.md
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ └── codeql.yml
├── .gitignore
├── CLAUDE.md
├── LICENSE
├── README.md
├── bin/
│ ├── commander.js
│ ├── generate.js
│ ├── import.js
│ ├── install-test.js
│ └── reldens-commands.js
├── client.js
├── generated-entities/
│ ├── entities/
│ │ ├── ads-banner-entity.js
│ │ ├── ads-entity.js
│ │ ├── ads-event-video-entity.js
│ │ ├── ads-played-entity.js
│ │ ├── ads-providers-entity.js
│ │ ├── ads-types-entity.js
│ │ ├── audio-categories-entity.js
│ │ ├── audio-entity.js
│ │ ├── audio-markers-entity.js
│ │ ├── audio-player-config-entity.js
│ │ ├── chat-entity.js
│ │ ├── chat-message-types-entity.js
│ │ ├── clan-entity.js
│ │ ├── clan-levels-entity.js
│ │ ├── clan-levels-modifiers-entity.js
│ │ ├── clan-members-entity.js
│ │ ├── config-entity.js
│ │ ├── config-types-entity.js
│ │ ├── drops-animations-entity.js
│ │ ├── features-entity.js
│ │ ├── items-group-entity.js
│ │ ├── items-inventory-entity.js
│ │ ├── items-item-entity.js
│ │ ├── items-item-modifiers-entity.js
│ │ ├── items-types-entity.js
│ │ ├── locale-entity.js
│ │ ├── objects-animations-entity.js
│ │ ├── objects-assets-entity.js
│ │ ├── objects-entity.js
│ │ ├── objects-items-inventory-entity.js
│ │ ├── objects-items-requirements-entity.js
│ │ ├── objects-items-rewards-entity.js
│ │ ├── objects-skills-entity.js
│ │ ├── objects-stats-entity.js
│ │ ├── objects-types-entity.js
│ │ ├── operation-types-entity.js
│ │ ├── players-entity.js
│ │ ├── players-state-entity.js
│ │ ├── players-stats-entity.js
│ │ ├── respawn-entity.js
│ │ ├── rewards-entity.js
│ │ ├── rewards-events-entity.js
│ │ ├── rewards-events-state-entity.js
│ │ ├── rewards-modifiers-entity.js
│ │ ├── rooms-change-points-entity.js
│ │ ├── rooms-entity.js
│ │ ├── rooms-return-points-entity.js
│ │ ├── scores-detail-entity.js
│ │ ├── scores-entity.js
│ │ ├── skills-class-level-up-animations-entity.js
│ │ ├── skills-class-path-entity.js
│ │ ├── skills-class-path-level-labels-entity.js
│ │ ├── skills-class-path-level-skills-entity.js
│ │ ├── skills-groups-entity.js
│ │ ├── skills-levels-entity.js
│ │ ├── skills-levels-modifiers-conditions-entity.js
│ │ ├── skills-levels-modifiers-entity.js
│ │ ├── skills-levels-set-entity.js
│ │ ├── skills-owners-class-path-entity.js
│ │ ├── skills-skill-animations-entity.js
│ │ ├── skills-skill-attack-entity.js
│ │ ├── skills-skill-entity.js
│ │ ├── skills-skill-group-relation-entity.js
│ │ ├── skills-skill-owner-conditions-entity.js
│ │ ├── skills-skill-owner-effects-conditions-entity.js
│ │ ├── skills-skill-owner-effects-entity.js
│ │ ├── skills-skill-physical-data-entity.js
│ │ ├── skills-skill-target-effects-conditions-entity.js
│ │ ├── skills-skill-target-effects-entity.js
│ │ ├── skills-skill-type-entity.js
│ │ ├── snippets-entity.js
│ │ ├── stats-entity.js
│ │ ├── target-options-entity.js
│ │ ├── users-entity.js
│ │ ├── users-locale-entity.js
│ │ └── users-login-entity.js
│ ├── entities-config.js
│ ├── entities-translations.js
│ └── models/
│ ├── mikro-orm/
│ │ ├── ads-banner-model.js
│ │ ├── ads-event-video-model.js
│ │ ├── ads-model.js
│ │ ├── ads-played-model.js
│ │ ├── ads-providers-model.js
│ │ ├── ads-types-model.js
│ │ ├── audio-categories-model.js
│ │ ├── audio-markers-model.js
│ │ ├── audio-model.js
│ │ ├── audio-player-config-model.js
│ │ ├── chat-message-types-model.js
│ │ ├── chat-model.js
│ │ ├── clan-levels-model.js
│ │ ├── clan-levels-modifiers-model.js
│ │ ├── clan-members-model.js
│ │ ├── clan-model.js
│ │ ├── config-model.js
│ │ ├── config-types-model.js
│ │ ├── drops-animations-model.js
│ │ ├── features-model.js
│ │ ├── items-group-model.js
│ │ ├── items-inventory-model.js
│ │ ├── items-item-model.js
│ │ ├── items-item-modifiers-model.js
│ │ ├── items-types-model.js
│ │ ├── locale-model.js
│ │ ├── objects-animations-model.js
│ │ ├── objects-assets-model.js
│ │ ├── objects-items-inventory-model.js
│ │ ├── objects-items-requirements-model.js
│ │ ├── objects-items-rewards-model.js
│ │ ├── objects-model.js
│ │ ├── objects-skills-model.js
│ │ ├── objects-stats-model.js
│ │ ├── objects-types-model.js
│ │ ├── operation-types-model.js
│ │ ├── players-model.js
│ │ ├── players-state-model.js
│ │ ├── players-stats-model.js
│ │ ├── registered-models-mikro-orm.js
│ │ ├── respawn-model.js
│ │ ├── rewards-events-model.js
│ │ ├── rewards-events-state-model.js
│ │ ├── rewards-model.js
│ │ ├── rewards-modifiers-model.js
│ │ ├── rooms-change-points-model.js
│ │ ├── rooms-model.js
│ │ ├── rooms-return-points-model.js
│ │ ├── scores-detail-model.js
│ │ ├── scores-model.js
│ │ ├── skills-class-level-up-animations-model.js
│ │ ├── skills-class-path-level-labels-model.js
│ │ ├── skills-class-path-level-skills-model.js
│ │ ├── skills-class-path-model.js
│ │ ├── skills-groups-model.js
│ │ ├── skills-levels-model.js
│ │ ├── skills-levels-modifiers-conditions-model.js
│ │ ├── skills-levels-modifiers-model.js
│ │ ├── skills-levels-set-model.js
│ │ ├── skills-owners-class-path-model.js
│ │ ├── skills-skill-animations-model.js
│ │ ├── skills-skill-attack-model.js
│ │ ├── skills-skill-group-relation-model.js
│ │ ├── skills-skill-model.js
│ │ ├── skills-skill-owner-conditions-model.js
│ │ ├── skills-skill-owner-effects-conditions-model.js
│ │ ├── skills-skill-owner-effects-model.js
│ │ ├── skills-skill-physical-data-model.js
│ │ ├── skills-skill-target-effects-conditions-model.js
│ │ ├── skills-skill-target-effects-model.js
│ │ ├── skills-skill-type-model.js
│ │ ├── snippets-model.js
│ │ ├── stats-model.js
│ │ ├── target-options-model.js
│ │ ├── users-locale-model.js
│ │ ├── users-login-model.js
│ │ └── users-model.js
│ ├── objection-js/
│ │ ├── ads-banner-model.js
│ │ ├── ads-event-video-model.js
│ │ ├── ads-model.js
│ │ ├── ads-played-model.js
│ │ ├── ads-providers-model.js
│ │ ├── ads-types-model.js
│ │ ├── audio-categories-model.js
│ │ ├── audio-markers-model.js
│ │ ├── audio-model.js
│ │ ├── audio-player-config-model.js
│ │ ├── chat-message-types-model.js
│ │ ├── chat-model.js
│ │ ├── clan-levels-model.js
│ │ ├── clan-levels-modifiers-model.js
│ │ ├── clan-members-model.js
│ │ ├── clan-model.js
│ │ ├── config-model.js
│ │ ├── config-types-model.js
│ │ ├── drops-animations-model.js
│ │ ├── features-model.js
│ │ ├── items-group-model.js
│ │ ├── items-inventory-model.js
│ │ ├── items-item-model.js
│ │ ├── items-item-modifiers-model.js
│ │ ├── items-types-model.js
│ │ ├── locale-model.js
│ │ ├── objects-animations-model.js
│ │ ├── objects-assets-model.js
│ │ ├── objects-items-inventory-model.js
│ │ ├── objects-items-requirements-model.js
│ │ ├── objects-items-rewards-model.js
│ │ ├── objects-model.js
│ │ ├── objects-skills-model.js
│ │ ├── objects-stats-model.js
│ │ ├── objects-types-model.js
│ │ ├── operation-types-model.js
│ │ ├── players-model.js
│ │ ├── players-state-model.js
│ │ ├── players-stats-model.js
│ │ ├── registered-models-objection-js.js
│ │ ├── respawn-model.js
│ │ ├── rewards-events-model.js
│ │ ├── rewards-events-state-model.js
│ │ ├── rewards-model.js
│ │ ├── rewards-modifiers-model.js
│ │ ├── rooms-change-points-model.js
│ │ ├── rooms-model.js
│ │ ├── rooms-return-points-model.js
│ │ ├── scores-detail-model.js
│ │ ├── scores-model.js
│ │ ├── skills-class-level-up-animations-model.js
│ │ ├── skills-class-path-level-labels-model.js
│ │ ├── skills-class-path-level-skills-model.js
│ │ ├── skills-class-path-model.js
│ │ ├── skills-groups-model.js
│ │ ├── skills-levels-model.js
│ │ ├── skills-levels-modifiers-conditions-model.js
│ │ ├── skills-levels-modifiers-model.js
│ │ ├── skills-levels-set-model.js
│ │ ├── skills-owners-class-path-model.js
│ │ ├── skills-skill-animations-model.js
│ │ ├── skills-skill-attack-model.js
│ │ ├── skills-skill-group-relation-model.js
│ │ ├── skills-skill-model.js
│ │ ├── skills-skill-owner-conditions-model.js
│ │ ├── skills-skill-owner-effects-conditions-model.js
│ │ ├── skills-skill-owner-effects-model.js
│ │ ├── skills-skill-physical-data-model.js
│ │ ├── skills-skill-target-effects-conditions-model.js
│ │ ├── skills-skill-target-effects-model.js
│ │ ├── skills-skill-type-model.js
│ │ ├── snippets-model.js
│ │ ├── stats-model.js
│ │ ├── target-options-model.js
│ │ ├── users-locale-model.js
│ │ ├── users-login-model.js
│ │ └── users-model.js
│ └── prisma/
│ ├── ads-banner-model.js
│ ├── ads-event-video-model.js
│ ├── ads-model.js
│ ├── ads-played-model.js
│ ├── ads-providers-model.js
│ ├── ads-types-model.js
│ ├── audio-categories-model.js
│ ├── audio-markers-model.js
│ ├── audio-model.js
│ ├── audio-player-config-model.js
│ ├── chat-message-types-model.js
│ ├── chat-model.js
│ ├── clan-levels-model.js
│ ├── clan-levels-modifiers-model.js
│ ├── clan-members-model.js
│ ├── clan-model.js
│ ├── config-model.js
│ ├── config-types-model.js
│ ├── drops-animations-model.js
│ ├── features-model.js
│ ├── items-group-model.js
│ ├── items-inventory-model.js
│ ├── items-item-model.js
│ ├── items-item-modifiers-model.js
│ ├── items-types-model.js
│ ├── locale-model.js
│ ├── objects-animations-model.js
│ ├── objects-assets-model.js
│ ├── objects-items-inventory-model.js
│ ├── objects-items-requirements-model.js
│ ├── objects-items-rewards-model.js
│ ├── objects-model.js
│ ├── objects-skills-model.js
│ ├── objects-stats-model.js
│ ├── objects-types-model.js
│ ├── operation-types-model.js
│ ├── players-model.js
│ ├── players-state-model.js
│ ├── players-stats-model.js
│ ├── registered-models-prisma.js
│ ├── respawn-model.js
│ ├── rewards-events-model.js
│ ├── rewards-events-state-model.js
│ ├── rewards-model.js
│ ├── rewards-modifiers-model.js
│ ├── rooms-change-points-model.js
│ ├── rooms-model.js
│ ├── rooms-return-points-model.js
│ ├── scores-detail-model.js
│ ├── scores-model.js
│ ├── skills-class-level-up-animations-model.js
│ ├── skills-class-path-level-labels-model.js
│ ├── skills-class-path-level-skills-model.js
│ ├── skills-class-path-model.js
│ ├── skills-groups-model.js
│ ├── skills-levels-model.js
│ ├── skills-levels-modifiers-conditions-model.js
│ ├── skills-levels-modifiers-model.js
│ ├── skills-levels-set-model.js
│ ├── skills-owners-class-path-model.js
│ ├── skills-skill-animations-model.js
│ ├── skills-skill-attack-model.js
│ ├── skills-skill-group-relation-model.js
│ ├── skills-skill-model.js
│ ├── skills-skill-owner-conditions-model.js
│ ├── skills-skill-owner-effects-conditions-model.js
│ ├── skills-skill-owner-effects-model.js
│ ├── skills-skill-physical-data-model.js
│ ├── skills-skill-target-effects-conditions-model.js
│ ├── skills-skill-target-effects-model.js
│ ├── skills-skill-type-model.js
│ ├── snippets-model.js
│ ├── stats-model.js
│ ├── target-options-model.js
│ ├── users-locale-model.js
│ ├── users-login-model.js
│ └── users-model.js
├── install/
│ ├── css/
│ │ └── styles.scss
│ ├── index.html
│ ├── index.js
│ └── site.webmanifest
├── lib/
│ ├── actions/
│ │ ├── client/
│ │ │ ├── game-manager-enricher.js
│ │ │ ├── messages-guard.js
│ │ │ ├── messages-handler.js
│ │ │ ├── player-selector.js
│ │ │ ├── plugin.js
│ │ │ ├── preloader-handler.js
│ │ │ ├── receiver-wrapper.js
│ │ │ ├── skills-ui.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ ├── factories/
│ │ │ ├── class-path-key-factory.js
│ │ │ └── skill-data-factory.js
│ │ ├── schemas/
│ │ │ └── skill-schema.js
│ │ └── server/
│ │ ├── battle-end-action.js
│ │ ├── battle.js
│ │ ├── data-loader.js
│ │ ├── entities/
│ │ │ ├── operation-types-entity-override.js
│ │ │ ├── skills-class-path-entity-override.js
│ │ │ ├── skills-levels-modifiers-entity-override.js
│ │ │ ├── skills-levels-set-entity-override.js
│ │ │ ├── skills-owners-class-path-entity-override.js
│ │ │ ├── skills-skill-animations-entity-override.js
│ │ │ ├── skills-skill-attack-entity-override.js
│ │ │ ├── skills-skill-entity-override.js
│ │ │ ├── skills-skill-owner-effects-entity-override.js
│ │ │ └── skills-skill-target-effects-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── event-listeners.js
│ │ ├── events/
│ │ │ ├── battle-ended-event.js
│ │ │ └── player-death-event.js
│ │ ├── initial-game-data-enricher.js
│ │ ├── message-actions.js
│ │ ├── models-manager.js
│ │ ├── player-class-path-handler.js
│ │ ├── player-enricher.js
│ │ ├── plugin.js
│ │ ├── pve.js
│ │ ├── pvp.js
│ │ ├── skills/
│ │ │ ├── type-attack.js
│ │ │ ├── type-effect.js
│ │ │ ├── type-physical-attack.js
│ │ │ ├── type-physical-effect.js
│ │ │ └── types.js
│ │ ├── skills-class-path-loader.js
│ │ ├── skills-extra-data-mapper.js
│ │ ├── storage/
│ │ │ ├── class-path-generator.js
│ │ │ ├── conditions-generator.js
│ │ │ ├── levels-generator.js
│ │ │ ├── modifiers-generator.js
│ │ │ └── skills-generator.js
│ │ └── storage-observer.js
│ ├── admin/
│ │ └── server/
│ │ ├── entities-config-override.js
│ │ ├── plugin.js
│ │ ├── room-map-tilesets-validator.js
│ │ ├── rooms-file-upload-renderer.js
│ │ ├── subscribers/
│ │ │ ├── create-admin-subscriber.js
│ │ │ ├── generators-routes-subscriber.js
│ │ │ ├── maps-wizard-subscriber.js
│ │ │ ├── objects-importer-subscriber.js
│ │ │ ├── rooms-entity-subscriber.js
│ │ │ ├── shutdown-subscriber.js
│ │ │ ├── skills-importer-subscriber.js
│ │ │ └── theme-manager-subscriber.js
│ │ └── templates-list.js
│ ├── ads/
│ │ ├── client/
│ │ │ ├── ads-provider.js
│ │ │ ├── messages-listener.js
│ │ │ ├── plugin.js
│ │ │ ├── providers/
│ │ │ │ ├── crazy-games/
│ │ │ │ │ ├── banners-handler.js
│ │ │ │ │ ├── validator.js
│ │ │ │ │ └── videos-handler.js
│ │ │ │ ├── crazy-games.js
│ │ │ │ ├── game-monetize.js
│ │ │ │ └── google-ad-sense.js
│ │ │ ├── providers-list.js
│ │ │ ├── sdk-handler.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── ads-start-handler.js
│ │ ├── ads-type/
│ │ │ ├── banner.js
│ │ │ ├── base-ad.js
│ │ │ └── event-video.js
│ │ ├── entities/
│ │ │ └── ads-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── event-handlers/
│ │ │ └── create-player-ads-handler.js
│ │ ├── message-actions.js
│ │ └── plugin.js
│ ├── audio/
│ │ ├── client/
│ │ │ ├── audio-ui.js
│ │ │ ├── audio-update.js
│ │ │ ├── manager.js
│ │ │ ├── messages-listener.js
│ │ │ ├── plugin.js
│ │ │ ├── scene-audio-player.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── audio-hot-plug-callbacks.js
│ │ ├── entities/
│ │ │ └── audio-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── manager.js
│ │ └── plugin.js
│ ├── bundlers/
│ │ └── drivers/
│ │ └── parcel-config.json
│ ├── chat/
│ │ ├── cleaner.js
│ │ ├── client/
│ │ │ ├── chat-tabs.js
│ │ │ ├── chat-ui.js
│ │ │ ├── messages-listener.js
│ │ │ ├── plugin.js
│ │ │ ├── snippets/
│ │ │ │ └── en_US.js
│ │ │ └── templates-handler.js
│ │ ├── constants.js
│ │ ├── message-factory.js
│ │ └── server/
│ │ ├── entities/
│ │ │ ├── chat-entity-override.js
│ │ │ └── chat-message-types-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── event-listener/
│ │ │ ├── guest-invalid-change-point.js
│ │ │ ├── npc-skills.js
│ │ │ └── player-skills.js
│ │ ├── manager.js
│ │ ├── message-actions.js
│ │ ├── messages/
│ │ │ ├── message-data-mapper.js
│ │ │ ├── npc-damage-callback.js
│ │ │ ├── npc-dodge-callback.js
│ │ │ ├── npc-modifiers-callback.js
│ │ │ ├── player-damage-callback.js
│ │ │ ├── player-dodge-callback.js
│ │ │ ├── player-modifiers-callback.js
│ │ │ └── validator.js
│ │ ├── messages-guard.js
│ │ ├── plugin.js
│ │ └── room-chat.js
│ ├── config/
│ │ ├── client/
│ │ │ └── config-manager.js
│ │ ├── constants.js
│ │ ├── processor.js
│ │ └── server/
│ │ ├── entities/
│ │ │ ├── config-entity-override.js
│ │ │ └── config-types-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ └── manager.js
│ ├── features/
│ │ ├── client/
│ │ │ ├── config-client.js
│ │ │ └── manager.js
│ │ ├── plugin-interface.js
│ │ └── server/
│ │ ├── config-server.js
│ │ ├── entities/
│ │ │ ├── features-entity-override.js
│ │ │ └── features-entity.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── manager.js
│ │ └── setup-server-properties.js
│ ├── firebase/
│ │ ├── client/
│ │ │ └── connector.js
│ │ └── server/
│ │ └── plugin.js
│ ├── game/
│ │ ├── allowed-file-types.js
│ │ ├── client/
│ │ │ ├── animations-defaults-merger.js
│ │ │ ├── communication/
│ │ │ │ ├── room-state-entities-manager.js
│ │ │ │ └── state-callbacks-manager.js
│ │ │ ├── engine/
│ │ │ │ └── sprite-text-factory.js
│ │ │ ├── fps-counter.js
│ │ │ ├── game-client.js
│ │ │ ├── game-dom.js
│ │ │ ├── game-engine.js
│ │ │ ├── game-manager.js
│ │ │ ├── handlers/
│ │ │ │ ├── client-start-handler.js
│ │ │ │ ├── errors-block-handler.js
│ │ │ │ ├── forgot-password-form-handler.js
│ │ │ │ ├── full-screen-handler.js
│ │ │ │ ├── guest-form-handler.js
│ │ │ │ ├── login-form-handler.js
│ │ │ │ ├── registration-form-handler.js
│ │ │ │ └── terms-and-conditions-handler.js
│ │ │ ├── instructions-ui.js
│ │ │ ├── joystick.js
│ │ │ ├── minimap-ui.js
│ │ │ ├── minimap.js
│ │ │ ├── room-events.js
│ │ │ ├── scene-dynamic.js
│ │ │ ├── scene-preloader.js
│ │ │ ├── settings-ui.js
│ │ │ ├── snippets/
│ │ │ │ └── en_US.js
│ │ │ ├── tileset-animation.js
│ │ │ ├── ui-factory.js
│ │ │ └── user-interface.js
│ │ ├── constants.js
│ │ ├── mime-types.js
│ │ ├── properties-handler.js
│ │ ├── reldens-ascii.js
│ │ ├── server/
│ │ │ ├── client-wrapper.js
│ │ │ ├── data-server-config.js
│ │ │ ├── data-server-initializer.js
│ │ │ ├── entities-loader.js
│ │ │ ├── entity-properties.js
│ │ │ ├── forgot-password.js
│ │ │ ├── game-server.js
│ │ │ ├── homepage-loader.js
│ │ │ ├── install-templates/
│ │ │ │ ├── .gitignore.dist
│ │ │ │ ├── data-package.json
│ │ │ │ └── knexfile.js.dist
│ │ │ ├── installer/
│ │ │ │ ├── entities-installation.js
│ │ │ │ ├── generic-driver-installation.js
│ │ │ │ ├── packages-installation.js
│ │ │ │ ├── prisma-installation.js
│ │ │ │ ├── prisma-subprocess-worker.js
│ │ │ │ └── project-files-creation.js
│ │ │ ├── installer.js
│ │ │ ├── login-manager.js
│ │ │ ├── mailer/
│ │ │ │ ├── nodemailer-factory.js
│ │ │ │ └── sendgrid-factory.js
│ │ │ ├── mailer.js
│ │ │ ├── manager.js
│ │ │ ├── maps-loader.js
│ │ │ ├── memory/
│ │ │ │ ├── active-player.js
│ │ │ │ └── active-players.js
│ │ │ ├── storage/
│ │ │ │ └── drivers-map.js
│ │ │ ├── template-engine.js
│ │ │ ├── templates-to-path-mapper.js
│ │ │ └── theme-manager.js
│ │ └── type-determiner.js
│ ├── import/
│ │ └── server/
│ │ ├── attributes-per-level-importer.js
│ │ ├── class-paths-importer.js
│ │ ├── maps-importer.js
│ │ ├── objects-importer.js
│ │ ├── players-experience-per-level-importer.js
│ │ ├── skills-importer.js
│ │ └── tile-extruder.js
│ ├── inventory/
│ │ ├── client/
│ │ │ ├── exchange/
│ │ │ │ └── trade-target-action.js
│ │ │ ├── inventory-receiver.js
│ │ │ ├── inventory-ui.js
│ │ │ ├── plugin.js
│ │ │ ├── snippets/
│ │ │ │ └── en_US.js
│ │ │ ├── templates-handler.js
│ │ │ ├── trade-items-helper.js
│ │ │ ├── trade-message-handler.js
│ │ │ └── trade-message-listener.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── entities/
│ │ │ ├── items-group-entity-override.js
│ │ │ ├── items-inventory-entity-override.js
│ │ │ └── items-item-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── exchange/
│ │ │ ├── player-processor.js
│ │ │ └── processor.js
│ │ ├── group-hot-plug-callbacks.js
│ │ ├── groups-data-remover.js
│ │ ├── items-factory.js
│ │ ├── message-actions.js
│ │ ├── models-manager.js
│ │ ├── plugin.js
│ │ ├── storage-observer.js
│ │ └── subscribers/
│ │ ├── player-death-subscriber.js
│ │ ├── player-subscriber.js
│ │ └── server-subscriber.js
│ ├── objects/
│ │ ├── client/
│ │ │ ├── animation-engine.js
│ │ │ ├── drops-message-listener.js
│ │ │ ├── objects-message-listener.js
│ │ │ ├── plugin.js
│ │ │ ├── snippets/
│ │ │ │ └── en_US.js
│ │ │ └── trader-object-ui.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── entities/
│ │ │ └── objects-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── handler/
│ │ │ └── objects-class-type.js
│ │ ├── manager.js
│ │ ├── object/
│ │ │ ├── object-types-classes.js
│ │ │ ├── object-types.js
│ │ │ └── type/
│ │ │ ├── animation-object.js
│ │ │ ├── base-object.js
│ │ │ ├── drop-object.js
│ │ │ ├── enemy-object.js
│ │ │ ├── multiple-object.js
│ │ │ ├── npc-object.js
│ │ │ └── trader-object.js
│ │ └── plugin.js
│ ├── prediction/
│ │ └── client/
│ │ ├── player-engine-prediction.js
│ │ ├── plugin.js
│ │ ├── prediction-world-creator.js
│ │ └── room-events-override.js
│ ├── respawn/
│ │ └── server/
│ │ ├── entities/
│ │ │ └── respawn-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── plugin.js
│ │ └── room-respawn.js
│ ├── rewards/
│ │ ├── client/
│ │ │ ├── message-handler.js
│ │ │ ├── message-listener.js
│ │ │ ├── messages-processor.js
│ │ │ ├── plugin.js
│ │ │ ├── preloader-handler.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── actions/
│ │ │ └── give-reward-action.js
│ │ ├── add-item-to-inventory.js
│ │ ├── drops-animations.js
│ │ ├── entities/
│ │ │ ├── drops-animations-entity-override.js
│ │ │ ├── rewards-entity-override.js
│ │ │ ├── rewards-events-entity-override.js
│ │ │ └── rewards-modifiers-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── event-handlers/
│ │ │ ├── event-handler.js
│ │ │ └── login-state-handler.js
│ │ ├── mappers/
│ │ │ ├── rewards-events-mapper.js
│ │ │ └── rewards-to-actions-mapper.js
│ │ ├── pick-up-object.js
│ │ ├── plugin.js
│ │ ├── repositories-extension.js
│ │ ├── reward-message-actions.js
│ │ ├── reward.js
│ │ ├── rewards-drops-mapper.js
│ │ ├── rewards-drops-processor.js
│ │ ├── rewards-events-data-sender.js
│ │ ├── rewards-events-handler.js
│ │ ├── rewards-events-message-actions.js
│ │ ├── rewards-events-provider.js
│ │ ├── rewards-events-updater.js
│ │ ├── rewards-mapper.js
│ │ ├── subscribers/
│ │ │ ├── object-subscriber.js
│ │ │ └── rewards-subscriber.js
│ │ ├── target-determiner.js
│ │ ├── validator/
│ │ │ └── reward-drop-validator.js
│ │ └── world-drop-handler.js
│ ├── rooms/
│ │ ├── client/
│ │ │ └── plugin.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── entities/
│ │ │ └── rooms-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── events/
│ │ │ └── joined-scene-room-event.js
│ │ ├── game.js
│ │ ├── login.js
│ │ ├── manager.js
│ │ ├── plugin.js
│ │ ├── random-player-state.js
│ │ ├── scene-data-filter.js
│ │ ├── scene.js
│ │ ├── state.js
│ │ └── world-config.js
│ ├── scores/
│ │ ├── client/
│ │ │ ├── messages-processor.js
│ │ │ ├── plugin.js
│ │ │ ├── preloader-handler.js
│ │ │ ├── scores-message-handler.js
│ │ │ ├── scores-message-listener.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── entities/
│ │ │ ├── scores-detail-entity-override.js
│ │ │ └── scores-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── mapper/
│ │ │ └── increase-score-on-kill-mapper.js
│ │ ├── plugin.js
│ │ ├── repositories-extension.js
│ │ ├── scores-provider.js
│ │ ├── scores-sender.js
│ │ ├── scores-updater.js
│ │ └── subscriber/
│ │ ├── create-scores-route.js
│ │ ├── increase-score-on-kill.js
│ │ └── send-initial-scores-data.js
│ ├── snippets/
│ │ ├── client/
│ │ │ ├── plugin.js
│ │ │ ├── snippets/
│ │ │ │ └── en_US.js
│ │ │ ├── snippets-ui.js
│ │ │ ├── templates-handler.js
│ │ │ └── translations-mapper.js
│ │ ├── constants.js
│ │ ├── server/
│ │ │ ├── configuration-enricher.js
│ │ │ ├── entities/
│ │ │ │ ├── locale-entity-override.js
│ │ │ │ ├── snippets-entity-override.js
│ │ │ │ └── users-locale-entity-override.js
│ │ │ ├── entities-config.js
│ │ │ ├── entities-translations.js
│ │ │ ├── initial-game-data-enricher.js
│ │ │ └── plugin.js
│ │ └── translator.js
│ ├── teams/
│ │ ├── client/
│ │ │ ├── clan-message-handler.js
│ │ │ ├── clan-message-listener.js
│ │ │ ├── messages-processor.js
│ │ │ ├── plugin.js
│ │ │ ├── target-box-enricher.js
│ │ │ ├── team-message-handler.js
│ │ │ ├── team-message-listener.js
│ │ │ └── templates-handler.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── clan-factory.js
│ │ ├── clan-message-actions.js
│ │ ├── clan-updates-handler.js
│ │ ├── clan.js
│ │ ├── entities/
│ │ │ ├── clan-entity-override.js
│ │ │ └── clan-levels-modifiers-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── event-handlers/
│ │ │ ├── create-player-clan-handler.js
│ │ │ ├── create-player-team-handler.js
│ │ │ ├── end-player-hit-change-point-team-handler.js
│ │ │ └── stats-update-handler.js
│ │ ├── message-actions/
│ │ │ ├── chat-message-actions.js
│ │ │ ├── clan-create.js
│ │ │ ├── clan-disconnect.js
│ │ │ ├── clan-join.js
│ │ │ ├── clan-leave.js
│ │ │ ├── team-join.js
│ │ │ ├── team-leave.js
│ │ │ ├── try-clan-invite.js
│ │ │ └── try-team-start.js
│ │ ├── players-data-mapper.js
│ │ ├── plugin.js
│ │ ├── team-message-actions.js
│ │ ├── team-updates-handler.js
│ │ └── team.js
│ ├── users/
│ │ ├── client/
│ │ │ ├── bar-properties.js
│ │ │ ├── lifebar-ui.js
│ │ │ ├── objects-handler.js
│ │ │ ├── player-engine.js
│ │ │ ├── player-stats-bars-ui.js
│ │ │ ├── player-stats-ui.js
│ │ │ ├── plugin.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── create-admin.js
│ │ ├── entities/
│ │ │ ├── players-entity-override.js
│ │ │ ├── players-state-entity-override.js
│ │ │ ├── players-stats-entity-override.js
│ │ │ ├── stats-entity-override.js
│ │ │ ├── users-entity-override.js
│ │ │ └── users-login-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── manager.js
│ │ ├── player.js
│ │ ├── plugin.js
│ │ └── reset-password.js
│ └── world/
│ ├── client/
│ │ ├── debug-world-creator.js
│ │ ├── plugin.js
│ │ └── renderer.js
│ ├── constants.js
│ ├── server/
│ │ ├── body-state.js
│ │ ├── collisions-manager.js
│ │ ├── object-body-state.js
│ │ ├── p2world.js
│ │ ├── path-finder.js
│ │ ├── physical-body.js
│ │ └── world-walkable-nodes-around-provider.js
│ ├── world-points-validator.js
│ ├── world-position-calculator.js
│ └── world-timer.js
├── migrations/
│ ├── development/
│ │ ├── 20190923183906_v4.0.0.js
│ │ ├── beta.09-sql-update.sql
│ │ ├── beta.12-sql-update.sql
│ │ ├── beta.15-sql-update.sql
│ │ ├── beta.16-sql-update.sql
│ │ ├── beta.16.5-sql-update.sql
│ │ ├── beta.17-sql-update.sql
│ │ ├── beta.18-sql-update.sql
│ │ ├── beta.18.1-sql-update.sql
│ │ ├── beta.19-sql-update.sql
│ │ ├── beta.20-sql-update.sql
│ │ ├── beta.21-sql-update.sql
│ │ ├── beta.22-sql-update.sql
│ │ ├── beta.23-sql-update.sql
│ │ ├── beta.24-sql-update.sql
│ │ ├── beta.24.1-sql-update.sql
│ │ ├── beta.25-sql-update.sql
│ │ ├── beta.26-sql-update.sql
│ │ ├── beta.27-sql-update.sql
│ │ ├── beta.28-sql-update.sql
│ │ ├── beta.30-sql-update.sql
│ │ ├── beta.31-sql-update.sql
│ │ ├── beta.34-sql-update.sql
│ │ ├── beta.35-sql-update.sql
│ │ ├── beta.36-sql-update.sql
│ │ ├── beta.38-sql-update.sql
│ │ ├── beta.38.3-sql-update.sql
│ │ ├── beta.39-sql-update.sql
│ │ ├── beta.39.7-sql-update.sql
│ │ ├── beta.39.8-sql-update.sql
│ │ └── reldens-test-sample-data-v4.0.0.sql
│ └── production/
│ ├── 20190923181825_v4.0.0.js
│ ├── mongo-db-install.js
│ ├── reldens-basic-config-v4.0.0.sql
│ ├── reldens-install-v4.0.0.sql
│ └── reldens-sample-data-v4.0.0.sql
├── package.json
├── server.js
├── tests/
│ ├── base-test.js
│ ├── database-reset-utility.js
│ ├── fixtures/
│ │ ├── crud-test-data.js
│ │ ├── entities-list.js
│ │ ├── features-test-data.js
│ │ ├── generate-complete-comparison.js
│ │ ├── generate-entities-fixtures.js
│ │ └── test-file.json
│ ├── manager.js
│ ├── run.js
│ ├── test-admin-auth.js
│ ├── test-admin-crud.js
│ ├── test-admin-features.js
│ └── utils.js
└── theme/
├── admin/
│ ├── functions.js
│ ├── reldens-admin-client.css
│ ├── reldens-admin-client.js
│ ├── reldens-functions.js
│ └── templates/
│ ├── cache-clean-button.html
│ ├── clear-all-cache-button.html
│ ├── dashboard.html
│ ├── default-copyright.html
│ ├── edit.html
│ ├── fields/
│ │ ├── edit/
│ │ │ ├── button.html
│ │ │ ├── checkbox.html
│ │ │ ├── file.html
│ │ │ ├── radio.html
│ │ │ ├── select.html
│ │ │ ├── text.html
│ │ │ ├── textarea.html
│ │ │ ├── tileset-alert-wrapper.html
│ │ │ └── tileset-file-item.html
│ │ └── view/
│ │ ├── audio.html
│ │ ├── audios.html
│ │ ├── boolean.html
│ │ ├── image.html
│ │ ├── images.html
│ │ ├── link.html
│ │ ├── links.html
│ │ ├── text.html
│ │ └── textarea.html
│ ├── layout.html
│ ├── list-content.html
│ ├── list.html
│ ├── login.html
│ ├── management.html
│ ├── maps-wizard-maps-selection.html
│ ├── maps-wizard.html
│ ├── objects-import.html
│ ├── pagination-link.html
│ ├── sections/
│ │ ├── editForm/
│ │ │ └── cms-pages.html
│ │ ├── view/
│ │ │ └── rooms.html
│ │ └── viewForm/
│ │ └── cms-pages.html
│ ├── sidebar-header.html
│ ├── sidebar-item.html
│ ├── sidebar.html
│ ├── skills-import.html
│ ├── theme-manager.html
│ └── view.html
├── default/
│ ├── assets/
│ │ ├── email/
│ │ │ ├── forgot.html
│ │ │ ├── reset-error.html
│ │ │ └── reset-success.html
│ │ ├── features/
│ │ │ ├── chat/
│ │ │ │ └── templates/
│ │ │ │ ├── message.html
│ │ │ │ ├── tab-content.html
│ │ │ │ ├── tab-label.html
│ │ │ │ ├── tabs-container.html
│ │ │ │ └── ui-chat.html
│ │ │ ├── inventory/
│ │ │ │ └── templates/
│ │ │ │ ├── equip.html
│ │ │ │ ├── group.html
│ │ │ │ ├── item.html
│ │ │ │ ├── trade-accept.html
│ │ │ │ ├── trade-action-remove.html
│ │ │ │ ├── trade-action.html
│ │ │ │ ├── trade-container.html
│ │ │ │ ├── trade-item-quantity.html
│ │ │ │ ├── trade-item.html
│ │ │ │ ├── trade-player-container.html
│ │ │ │ ├── trade-requirements.html
│ │ │ │ ├── trade-rewards.html
│ │ │ │ ├── trade-start.html
│ │ │ │ ├── ui-equipment.html
│ │ │ │ ├── ui-inventory.html
│ │ │ │ └── usable.html
│ │ │ ├── rewards/
│ │ │ │ └── templates/
│ │ │ │ ├── ui-rewards-list.html
│ │ │ │ └── ui-rewards.html
│ │ │ ├── scores/
│ │ │ │ └── templates/
│ │ │ │ ├── ui-scores-table.html
│ │ │ │ └── ui-scores.html
│ │ │ ├── skills/
│ │ │ │ └── templates/
│ │ │ │ ├── ui-class-path.html
│ │ │ │ ├── ui-experience.html
│ │ │ │ ├── ui-level.html
│ │ │ │ ├── ui-skill-box.html
│ │ │ │ └── ui-skills.html
│ │ │ ├── snippets/
│ │ │ │ └── templates/
│ │ │ │ └── ui-snippets.html
│ │ │ └── teams/
│ │ │ └── templates/
│ │ │ ├── clan-accept.html
│ │ │ ├── clan-container.html
│ │ │ ├── clan-create.html
│ │ │ ├── clan-invite.html
│ │ │ ├── clan-member-data.html
│ │ │ ├── clan-player-data.html
│ │ │ ├── clan-remove.html
│ │ │ ├── shared-property.html
│ │ │ ├── team-accept.html
│ │ │ ├── team-container.html
│ │ │ ├── team-invite.html
│ │ │ ├── team-player-data.html
│ │ │ ├── team-remove.html
│ │ │ ├── ui-clan.html
│ │ │ └── ui-teams.html
│ │ ├── html/
│ │ │ ├── dialog-box.html
│ │ │ ├── layout.html
│ │ │ ├── player-stat.html
│ │ │ ├── player-stats-bar.html
│ │ │ ├── ui-action-box.html
│ │ │ ├── ui-audio-category-row.html
│ │ │ ├── ui-audio.html
│ │ │ ├── ui-controls.html
│ │ │ ├── ui-full-screen-button.html
│ │ │ ├── ui-instructions.html
│ │ │ ├── ui-loading.html
│ │ │ ├── ui-minimap.html
│ │ │ ├── ui-option-button.html
│ │ │ ├── ui-option-icon.html
│ │ │ ├── ui-options-container.html
│ │ │ ├── ui-player-box.html
│ │ │ ├── ui-player-stats.html
│ │ │ ├── ui-scene-label.html
│ │ │ ├── ui-settings-content.html
│ │ │ ├── ui-settings.html
│ │ │ └── ui-target.html
│ │ └── maps/
│ │ ├── reldens-bots-forest-house-01-n0.json
│ │ ├── reldens-bots-forest.json
│ │ ├── reldens-bots.json
│ │ ├── reldens-forest.json
│ │ ├── reldens-gravity.json
│ │ ├── reldens-house-1-2d-floor.json
│ │ ├── reldens-house-1.json
│ │ ├── reldens-house-2.json
│ │ └── reldens-town.json
│ ├── browserconfig.xml
│ ├── config.js
│ ├── css/
│ │ ├── ads.scss
│ │ ├── base.scss
│ │ ├── chat.scss
│ │ ├── firebase.scss
│ │ ├── game-over.scss
│ │ ├── instructions.scss
│ │ ├── items-system.scss
│ │ ├── joystick.scss
│ │ ├── minimap.scss
│ │ ├── player-selection.scss
│ │ ├── player-stats-bars.scss
│ │ ├── rewards-events.scss
│ │ ├── scores.scss
│ │ ├── settings.scss
│ │ ├── skills.scss
│ │ ├── styles.scss
│ │ ├── teams.scss
│ │ ├── terms-and-conditions.scss
│ │ ├── variables.scss
│ │ └── wooden-ui.scss
│ ├── es-index.html
│ ├── index.html
│ ├── index.js
│ └── site.webmanifest
├── index.js.dist
└── plugins/
├── bot.js
├── client-plugin.js
├── objects/
│ ├── client/
│ │ └── npc1.js
│ └── server/
│ ├── healer.js
│ ├── quest-npc.js
│ └── weapons-master.js
└── server-plugin.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .claude/client-camera-follow-system.md
================================================
# Client Camera Follow System Architecture
This document describes how the camera follow system works in the Reldens client-side code.
## Overview
The camera follow system manages how the Phaser camera tracks the player character during gameplay. It involves multiple components across the client architecture: PlayerEngine, GameEngine, and scene management.
## Key Components
### 1. PlayerEngine (lib/users/client/player-engine.js)
**Purpose**: Manages the player character on the client-side, including camera initialization and configuration.
**Camera Configuration Properties** (lines 88-98):
```javascript
this.cameraRoundPixels = Boolean(
this.config.getWithoutLogs('client/general/engine/cameraRoundPixels', true)
);
this.cameraInterpolationX = Number(
this.config.getWithoutLogs('client/general/engine/cameraInterpolationX', 0.04)
);
this.cameraInterpolationY = Number(
this.config.getWithoutLogs('client/general/engine/cameraInterpolationY', 0.04)
);
```
**Configuration Source**: These values come from the database `config` table with scope `client` and are loaded during game initialization.
### 2. Camera Initialization Flow (PlayerEngine.create())
**Execution Order** (lines 115-139):
1. **Player Sprite Creation** (line 126):
- `this.addPlayer(this.playerId, addPlayerData)` creates the player sprite in the physics world
2. **Initial Camera Follow** (line 127):
- `this.scene.cameras.main.startFollow(this.players[this.playerId])`
- Camera begins tracking the player sprite
3. **Scene Visibility** (line 128):
- `this.scene.scene.setVisible(true, this.roomName)` makes the scene visible
4. **Camera Fade-In Effect** (line 129):
- `this.scene.cameras.main.fadeFrom(this.fadeDuration)`
- Starts fade-in animation (default 1000ms duration)
5. **Physics World Configuration** (lines 130-132):
- `fixedStep = false` enables variable physics timestep
- Sets physics and camera bounds to match map dimensions
6. **Camera Fade Complete Handler** (lines 134-138):
- Event listener triggered when fade animation completes
- Re-initializes camera follow with interpolation settings
- Sets lerp and roundPixels values
### 3. Phaser Camera Follow API
**startFollow() Method Signature**:
```javascript
camera.startFollow(target, roundPixels, lerpX, lerpY, offsetX, offsetY)
```
**Parameters**:
- `target`: The game object (player sprite) to follow
- `roundPixels` (optional): Boolean - force pixel-perfect rendering
- `lerpX` (optional): Number - horizontal interpolation (0-1, default 1)
- `lerpY` (optional): Number - vertical interpolation (0-1, default 1)
- `offsetX` (optional): Number - horizontal offset from target center
- `offsetY` (optional): Number - vertical offset from target center
**Lerp Behavior**:
- Value of `1`: Camera instantly snaps to target position (no interpolation)
- Value < `1`: Camera smoothly interpolates to target position
- Lower values (e.g., 0.04) = slower, smoother camera movement
- Higher values (e.g., 0.8) = faster, more responsive camera movement
### 4. GameEngine.updateGameSize() Integration
**Purpose** (lib/game/client/game-engine.js:79-106): Handles responsive behavior when window resizes or fullscreen toggles.
**Camera Lerp Adjustment** (lines 84-86, 101-104):
```javascript
if(player){
activeScene.cameras.main.setLerp(player.cameraInterpolationX, player.cameraInterpolationY);
}
```
**Execution Flow**:
1. **Before resize operations** (line 85): Sets lerp values
2. **Timeout delay** (line 87): Waits for configured duration (default 500ms)
3. **After resize operations** (line 103): Restores lerp values
**Why Twice?**:
- First call: Prepares camera for UI element repositioning
- Second call: Ensures camera tracking restored after all resize operations complete
### 5. Event-Driven Architecture
**Scene Creation Event** (game-manager.js:248):
```javascript
this.events.on('reldens.afterSceneDynamicCreate', async () => {
this.gameEngine.updateGameSize(this);
});
```
**Timing Sequence**:
1. Scene created
2. PlayerEngine.create() called - camera follow initialized
3. Camera fade starts (1000ms)
4. `reldens.afterSceneDynamicCreate` event fires
5. `updateGameSize()` called - adjusts camera lerp
6. Camera fade completes - lerp values set in event handler
### 6. Configuration Values
**Database Config Paths**:
- `client/general/engine/cameraRoundPixels`: Boolean (default: true)
- `client/general/engine/cameraInterpolationX`: Float (default: 0.04)
- `client/general/engine/cameraInterpolationY`: Float (default: 0.04)
- `client/players/animations/fadeDuration`: Integer milliseconds (default: 1000)
- `client/general/gameEngine/updateGameSizeTimeOut`: Integer milliseconds (default: 500)
**Config Loading**: Values are loaded from database during server initialization and sent to client in the `START_GAME` message as part of `gameConfig`.
### 7. Physics World Integration
**Fixed Step Setting** (player-engine.js:130):
```javascript
this.scene.physics.world.fixedStep = false;
```
**Impact**:
- `false`: Variable timestep - physics updates based on actual frame time
- `true`: Fixed timestep - physics updates at consistent intervals regardless of frame rate
**Camera Bounds** (lines 131-132):
```javascript
this.scene.physics.world.setBounds(0, 0, this.scene.map.widthInPixels, this.scene.map.heightInPixels);
this.scene.cameras.main.setBounds(0, 0, this.scene.map.widthInPixels, this.scene.map.heightInPixels);
```
Both physics world and camera are constrained to the map dimensions to prevent the camera from showing areas outside the game world.
### 8. Responsive Behavior
**Window Resize Listener** (game-manager.js:253-255):
```javascript
this.gameDom.getWindow().addEventListener('resize', () => {
this.gameEngine.updateGameSize(this);
});
```
**Fullscreen Handlers** (handlers/full-screen-handler.js:57, 65):
- Entering fullscreen: `updateGameSize()` called
- Exiting fullscreen: `updateGameSize()` called
**Purpose**: Ensures camera interpolation remains consistent across different viewport sizes and display modes.
## Data Flow Summary
1. Database Config
2. Server loads config
3. Client receives config in START_GAME message
4. PlayerEngine constructor reads config values
5. PlayerEngine.create() initializes camera
6. startFollow() begins tracking player
7. Fade animation starts
8. Camera fade completes - lerp values applied
9. Window resize events - updateGameSize() maintains lerp
## Key Technical Points
1. **Camera initialization happens in two phases**: Initial `startFollow()` and post-fade configuration
2. **Lerp values must be passed to `startFollow()` or set via `setLerp()`** for interpolation to work
3. **Round pixels and lerp work together**: Round pixels prevents sub-pixel jitter, lerp provides smooth motion
4. **Physics timestep affects camera smoothness**: Variable timestep can cause frame-to-frame variations
5. **Responsive system maintains camera settings**: `updateGameSize()` ensures lerp persists through viewport changes
## File Locations
- **PlayerEngine**: `lib/users/client/player-engine.js`
- **GameEngine**: `lib/game/client/game-engine.js`
- **GameManager**: `lib/game/client/game-manager.js`
- **FullScreenHandler**: `lib/game/client/handlers/full-screen-handler.js`
- **Config Database**: `config` table with `scope='client'`
================================================
FILE: .claude/commands-reference.md
================================================
# Commands Reference
Complete reference for all Reldens CLI commands.
## CLI Binaries
The project provides three main CLI entry points:
- `reldens` - Main command router (bin/reldens-commands.js)
- `reldens-generate` - Data generation tool (bin/generate.js)
- `reldens-import` - Data import tool (bin/import.js)
## Development & Building
```bash
# Run tests
npm test
# Or with filters
node tests/manager.js --filter="test-name" --break-on-error
# Build commands (via reldens CLI)
reldens buildCss [theme-name] # Build theme styles
reldens buildClient [theme-name] # Build client HTML
reldens buildSkeleton # Build both styles and client
reldens fullRebuild # Complete rebuild from scratch
# Theme & asset management
reldens installDefaultTheme # Install default theme
reldens copyAssetsToDist # Copy assets to dist folder
reldens copyDefaultAssets # Copy default assets to dist/assets
reldens copyDefaultTheme # Copy default theme to project
reldens copyPackage # Copy reldens module packages to project
reldens resetDist # Delete and recreate dist folder
reldens removeDist # Delete dist folder only
# Database & entities
reldens generateEntities [--override] # Generate entities from database schema
# This reads .env credentials and uses @reldens/storage to generate entities
# Generated entities are placed in the generated-entities/ directory
# Direct entity generation with connection arguments (bypasses .env):
npx reldens-storage generateEntities --user=reldens --pass=reldens --database=reldens_clean --driver=objection-js
```
## Prisma-Specific Commands
**IMPORTANT:** Prisma requires a separate client generation step before entities can be generated.
```bash
# Step 1: Generate Prisma schema and client from existing database
# This introspects the database and creates prisma/schema.prisma + prisma/client/
npx reldens-storage-prisma --host=localhost --port=3306 --user=reldens --password=reldens --database=reldens_clean --clientOutputPath=./client
# Step 2: Generate Reldens entities using Prisma driver
npx reldens-storage generateEntities --user=reldens --pass=reldens --database=reldens_clean --driver=prisma
# Full parameter list for reldens-storage-prisma:
# --host Database host (default: localhost)
# --port Database port (default: 3306)
# --user Database username (required)
# --password Database password (required)
# --database Database name (required)
# --clientOutputPath Output path for Prisma client (default: ./client)
# --schemaPath Path for schema.prisma file (default: ./prisma)
```
**Prisma Workflow:**
1. Run `reldens-storage-prisma` to generate schema.prisma and Prisma client
2. The command introspects your MySQL database and creates the Prisma schema
3. Run `reldens-storage generateEntities` with `--driver=prisma` to generate Reldens entities
4. Set `RELDENS_STORAGE_DRIVER=prisma` in your `.env` file to use Prisma at runtime
**Environment Variables for Prisma:**
```
RELDENS_STORAGE_DRIVER=prisma
RELDENS_DB_URL=mysql://user:password@host:port/database
```
## Installation & Setup
```bash
reldens createApp # Create base project skeleton
reldens installSkeleton # Install skeleton
reldens copyEnvFile # Copy .env.dist template
reldens copyKnexFile # Copy knexfile.js template
reldens copyIndex # Copy index.js template
reldens copyServerFiles # Reset dist and run fullRebuild
reldens copyNew # Copy all default files for fullRebuild
reldens help # Show all available commands
reldens test # Test file system access
```
## Data Generation Tools
```bash
# Generate game data (via reldens-generate)
reldens-generate players-experience # Generate player XP per level
reldens-generate monsters-experience # Generate monster XP per level
reldens-generate attributes # Generate attributes per level
reldens-generate maps # Generate maps with various loaders
# Data import (via reldens-import)
reldens-import [data-type] # Import game data
```
## User Management Commands
```bash
# Create admin user
reldens createAdmin --user=username --pass=password --email=email@example.com
# Creates an admin user with role_id from config (default: 1)
# Validates email format and username/email uniqueness
# Password is automatically encrypted using PBKDF2 SHA-512
# Reset user password
reldens resetPassword --user=username --pass=newpassword
# Resets password for existing user
# Password is automatically encrypted
# Works for any user (admin or regular)
# Examples:
reldens createAdmin --user=admin --pass=SecurePass123 --email=admin@yourgame.com
reldens resetPassword --user=someuser --pass=NewSecurePass456
```
**Implementation Details:**
- Service classes: `CreateAdmin` and `ResetPassword` in `lib/users/server/`
- Both receive `serverManager` in constructor (following importer pattern)
- Services return boolean result with `error` property for failure details
- `createAdmin` uses existing `usersRepository.create()` with `role_id` in userData
- `resetPassword` uses `usersRepository.loadOneBy()` and `updateById()`
- Admin role ID from config: `server/admin/roleId` (default: 1)
- Email validation via `sc.validateInput(email, 'email')` from `@reldens/utils`
- Commands initialize ServerManager automatically from `.env` (pattern from `bin/import.js`)
- Password encryption uses `Encryptor` from `@reldens/server-utils` (100k iterations, SHA-512)
================================================
FILE: .claude/entities-reference.md
================================================
# Entities Reference
Complete list of all 60+ entity types in the Reldens platform.
Entities are located in `generated-entities/entities/` and are auto-generated from the database schema.
## Ads System
- ads
- ads-banner
- ads-event-video
- ads-played
- ads-providers
- ads-types
## Audio System
- audio
- audio-categories
- audio-markers
- audio-player-config
## Chat System
- chat
- chat-message-types
## Clans/Teams System
- clan
- clan-levels
- clan-levels-modifiers
- clan-members
## Configuration
- config
- config-types
## Drops/Rewards
- drops-animations
## Features
- features
## Items System
- items-group
- items-inventory
- items-item
- items-item-modifiers
- items-types
## Localization
- locale
- users-locale
## Objects System
- objects
- objects-animations
- objects-assets
- objects-items-inventory
- objects-items-requirements
- objects-items-rewards
- objects-skills
- objects-stats
- objects-types
## Operations
- operation-types
## Players
- players
- players-state
- players-stats
## Respawn System
- respawn
## Rewards System
- rewards
- rewards-events
- rewards-events-state
- rewards-modifiers
## Rooms/Maps
- rooms
- rooms-change-points
- rooms-return-points
## Scores/Leaderboards
- scores
- scores-detail
## Skills System
- skills-class-level-up-animations
- skills-class-path
- skills-class-path-level-labels
- skills-class-path-level-skills
- skills-groups
- skills-levels
- skills-levels-modifiers
- skills-levels-modifiers-conditions
- skills-levels-set
- skills-owners-class-path
- skills-skill
- skills-skill-animations
- skills-skill-attack
- skills-skill-group-relation
- skills-skill-owner-conditions
- skills-skill-owner-effects
- skills-skill-owner-effects-conditions
- skills-skill-physical-data
- skills-skill-target-effects
- skills-skill-target-effects-conditions
- skills-skill-type
## Snippets
- snippets
## Stats/Modifiers
- stats
- target-options
## Users/Authentication
- users
- users-login
## Entity Relations
Entity relations keys are defined in `generated-entities/entities-config.js`.
Custom entity overrides are located in `lib/[plugin-folder]/server/entities` or `lib/[plugin-folder]/server/models`.
================================================
FILE: .claude/environment-variables.md
================================================
# Environment Variables Reference
Complete reference for all RELDENS_* environment variables.
See `lib/game/server/install-templates/.env.dist` for the template file.
## Application Server
- `NODE_ENV` - Environment mode (production/development)
- `RELDENS_DEFAULT_ENCODING` - Default encoding (default: utf8)
- `RELDENS_APP_HOST` - Application host
- `RELDENS_APP_PORT` - Application port
- `RELDENS_PUBLIC_URL` - Public URL for the application
## HTTPS Configuration
- `RELDENS_EXPRESS_USE_HTTPS` - Enable HTTPS
- `RELDENS_EXPRESS_HTTPS_PRIVATE_KEY` - Private key path
- `RELDENS_EXPRESS_HTTPS_CERT` - Certificate path
- `RELDENS_EXPRESS_HTTPS_CHAIN` - Certificate chain path
- `RELDENS_EXPRESS_HTTPS_PASSPHRASE` - HTTPS passphrase
## Express Server
- `RELDENS_USE_EXPRESS_JSON` - Enable JSON parsing
- `RELDENS_EXPRESS_JSON_LIMIT` - JSON payload limit
- `RELDENS_EXPRESS_URLENCODED_LIMIT` - URL encoded limit
- `RELDENS_GLOBAL_RATE_LIMIT` - Global rate limiting
- `RELDENS_TOO_MANY_REQUESTS_MESSAGE` - Rate limit message
- `RELDENS_USE_URLENCODED` - Enable URL encoding
- `RELDENS_USE_HELMET` - Enable Helmet security
- `RELDENS_USE_XSS_PROTECTION` - Enable XSS protection
- `RELDENS_USE_CORS` - Enable CORS
- `RELDENS_CORS_ORIGIN` - CORS origin
- `RELDENS_CORS_METHODS` - CORS methods
- `RELDENS_CORS_HEADERS` - CORS headers
- `RELDENS_EXPRESS_SERVE_HOME` - Serve dynamic home page
- `RELDENS_EXPRESS_TRUSTED_PROXY` - Trusted proxy
- `RELDENS_EXPRESS_RATE_LIMIT_MS` - Rate limit window (default: 60000)
- `RELDENS_EXPRESS_RATE_LIMIT_MAX_REQUESTS` - Max requests per window (default: 30)
- `RELDENS_EXPRESS_RATE_LIMIT_APPLY_KEY_GENERATOR` - Apply key generator
- `RELDENS_EXPRESS_SERVE_STATICS` - Serve static files
## Admin Panel
- `RELDENS_ADMIN_ROUTE_PATH` - Admin panel route path
- `RELDENS_ADMIN_SECRET` - Admin authentication secret
- `RELDENS_HOT_PLUG` - Enable hot-plug configuration updates (0/1)
## Colyseus Monitor
- `RELDENS_MONITOR` - Enable Colyseus monitor
- `RELDENS_MONITOR_AUTH` - Enable monitor authentication
- `RELDENS_MONITOR_USER` - Monitor username
- `RELDENS_MONITOR_PASS` - Monitor password
## Storage & Database
- `RELDENS_STORAGE_DRIVER` - Storage driver (objection-js, mikro-orm, prisma)
- `RELDENS_DB_CLIENT` - Database client (mysql, mysql2, mongodb)
- `RELDENS_DB_HOST` - Database host
- `RELDENS_DB_PORT` - Database port
- `RELDENS_DB_NAME` - Database name
- `RELDENS_DB_USER` - Database username
- `RELDENS_DB_PASSWORD` - Database password
- `RELDENS_DB_POOL_MIN` - Connection pool minimum (default: 2)
- `RELDENS_DB_POOL_MAX` - Connection pool maximum (default: 10)
- `RELDENS_DB_LIMIT` - Query limit (default: 0)
- `RELDENS_DB_URL` - Full database URL (auto-generated if not specified)
- `RELDENS_DB_URL_OPTIONS` - Additional URL options
## Logging
- `RELDENS_LOG_LEVEL` - Log level (0-7, default: 7)
- `RELDENS_ENABLE_TRACE_FOR` - Enable trace for specific levels (emergency,alert,critical)
## Mailer
- `RELDENS_MAILER_ENABLE` - Enable email functionality
- `RELDENS_MAILER_SERVICE` - Mail service provider
- `RELDENS_MAILER_HOST` - SMTP host
- `RELDENS_MAILER_PORT` - SMTP port
- `RELDENS_MAILER_USER` - SMTP username
- `RELDENS_MAILER_PASS` - SMTP password
- `RELDENS_MAILER_FROM` - From email address
- `RELDENS_MAILER_FORGOT_PASSWORD_LIMIT` - Forgot password attempts limit (default: 4)
## Bundler
- `RELDENS_ALLOW_RUN_BUNDLER` - Allow automatic bundler execution via createClientBundle() (default: 0)
- `RELDENS_ALLOW_BUILD_CLIENT` - Allow client build execution via buildClient() (default: 1)
- `RELDENS_ALLOW_BUILD_CSS` - Allow CSS build execution via buildCss() (default: 1)
- `RELDENS_FORCE_RESET_DIST_ON_BUNDLE` - Force reset dist on bundle
- `RELDENS_FORCE_COPY_ASSETS_ON_BUNDLE` - Force copy assets on bundle
- `RELDENS_JS_SOURCEMAPS` - Enable JavaScript source maps
- `RELDENS_CSS_SOURCEMAPS` - Enable CSS source maps
**Important**: Always use `createClientBundle()` instead of calling `buildClient()` directly when building during server startup. The `createClientBundle()` method respects `RELDENS_ALLOW_RUN_BUNDLER` and provides additional configuration options.
## Game Server
- `RELDENS_PING_INTERVAL` - Ping interval in ms (default: 5000)
- `RELDENS_PING_MAX_RETRIES` - Max ping retries (default: 3)
## Firebase
- `RELDENS_FIREBASE_ENABLE` - Enable Firebase authentication
- `RELDENS_FIREBASE_API_KEY` - Firebase API key
- `RELDENS_FIREBASE_APP_ID` - Firebase app ID
- `RELDENS_FIREBASE_AUTH_DOMAIN` - Firebase auth domain
- `RELDENS_FIREBASE_DATABASE_URL` - Firebase database URL
- `RELDENS_FIREBASE_PROJECT_ID` - Firebase project ID
- `RELDENS_FIREBASE_STORAGE_BUCKET` - Firebase storage bucket
- `RELDENS_FIREBASE_MESSAGING_SENDER_ID` - Firebase sender ID
- `RELDENS_FIREBASE_MEASUREMENTID` - Firebase measurement ID
================================================
FILE: .claude/feature-modules.md
================================================
# Feature Modules Reference
Complete reference for all 23 feature modules under `lib/`.
## Core/Game Management
### Game (`lib/game/`)
Core game engine
- ServerManager - Main server orchestrator (lib/game/server/manager.js)
- GameManager - Main client orchestrator (lib/game/client/game-manager.js)
- Data server configuration
- Entities loader
- Maps loader
- Login manager
- Installation scripts
- Theme manager
### Rooms (`lib/rooms/`)
Core multiplayer room system
- `server/scene.js` (RoomScene): Main game room with physics, collisions, objects
- `server/login.js` (RoomLogin): Authentication and player initialization
- Client connects via `room-events.js` to handle server state synchronization
### World (`lib/world/`)
Physics engine integration (P2.js), pathfinding, collisions
- Authoritative physics calculations
- Collision detection and handling
- Pathfinding algorithms
### Config (`lib/config/`)
Configuration management
- Database-driven configuration
- Environment variable handling
- Runtime configuration overrides
### Features (`lib/features/`)
Plugin-like modular system
- Features are loaded from database (`features` table with `is_enabled` flag)
- `server/manager.js` (FeaturesManager) dynamically loads enabled features
- Each feature can hook into events via `setup()` method
## Gameplay Systems
### Actions (`lib/actions/`)
Combat system (PvP/PvE), skills, battle mechanics
- Server handles authoritative battle calculations
- Client receives battle states and renders animations
- `server/battle.js` - Main battle system
- `server/pve.js` - PvE combat logic
- `server/pvp.js` - PvP combat logic
### Inventory (`lib/inventory/`)
Items system with equipment and usable items
- Integrates with @reldens/items-system
- Item management, equipment slots, consumables
### Respawn (`lib/respawn/`)
Player and NPC respawn system
- Death handling
- Respawn points configuration
### Rewards (`lib/rewards/`)
Loot and rewards system
- Drop tables
- Reward distribution
### Scores (`lib/scores/`)
Leaderboards and ranking system
- Player scores tracking
- Global leaderboards
### Teams (`lib/teams/`)
Party/guild system
- Team formation
- Shared objectives
- Clan levels and bonuses
## Player Systems
### Users (`lib/users/`)
Authentication, registration, player management
- Supports guest users, Firebase authentication
- `server/login-manager.js` handles all auth flows
- Player creation and management
### Chat (`lib/chat/`)
Multi-channel chat (global, room, private messages)
- Message types and tabs
- Real-time messaging
### Audio (`lib/audio/`)
Sound and music system
- Background music management
- Sound effects for actions and events
- Audio configuration per scene/room
### Prediction (`lib/prediction/`)
Client-side prediction system
- Reduces perceived latency
- Smooths player movement
## Integration/Support
### Admin (`lib/admin/`)
Admin panel integration with @reldens/cms
- Manages game configuration through web interface
- Handles entity CRUD operations
- Supports hot-plug configuration updates
### Firebase (`lib/firebase/`)
Firebase integration
- Firebase authentication
- Client-side Firebase SDK integration
### Ads (`lib/ads/`)
Advertisement integration system
- Third-party ad network support (CrazyGames, GameMonetize)
- Ad placement configuration
### Import (`lib/import/`)
Data import utilities
- File handlers
- MIME type detection
- Bulk data import tools
### Objects (`lib/objects/`)
Game objects (NPCs, interactables, respawn areas)
- `server/manager.js` loads and manages room objects
- Objects can listen to messages via `listenMessages` interface
### Snippets (`lib/snippets/`)
Reusable code snippets and utilities
- Common helper functions
- Shared utilities across modules
### Bundlers (`lib/bundlers/`)
Asset bundling drivers
- Parcel integration
- CSS and JavaScript bundling
- Theme asset compilation
================================================
FILE: .claude/guest-system-technical-guide.md
================================================
# Guest System Technical Guide
## Overview
The guest system allows anonymous players to join the game without registration. This document explains the complete technical flow from database configuration to client-side form activation.
---
## 1. Database Configuration
### Rooms Table - `customData` Field
Each room can be marked as guest-accessible via the `customData` JSON field:
```json
{
"allowGuest": true
}
```
**Location:** `rooms` table in `customData` column
**Example SQL:**
```sql
UPDATE rooms SET customData = '{"allowGuest": true}' WHERE name = 'town';
```
---
## 2. Server-Side Flow
### 2.1 Rooms Loading (`lib/rooms/server/manager.js`)
**Method:** `loadRooms()` (lines 204-241)
```javascript
async loadRooms(){
let roomsModels = await this.dataServer.getEntity('rooms').loadAllWithRelations([...]);
// Process each room
for(let room of roomsModels){
let roomModel = this.generateRoomModel(room);
rooms.push(roomModel);
roomsById[room.id] = roomModel;
roomsByName[room.name] = roomModel;
}
// Filter guest rooms
this.availableRoomsGuest = this.filterGuestRooms(roomsByName);
// Create room lists for registration and login
let registrationRooms = this.filterRooms(true);
this.registrationAvailableRooms = this.extractRoomDataForSelector(registrationRooms);
this.registrationAvailableRoomsGuest = this.extractRoomDataForSelector(
this.fetchGuestRooms(registrationRooms)
);
let loginRooms = this.filterRooms(false);
this.loginAvailableRooms = this.extractRoomDataForSelector(loginRooms);
this.loginAvailableRoomsGuest = this.extractRoomDataForSelector(
this.fetchGuestRooms(loginRooms)
);
return this.loadedRooms;
}
```
### 2.2 Guest Room Filtering (`lib/rooms/server/manager.js`)
**Method:** `filterGuestRooms()` (line 415+)
```javascript
filterGuestRooms(availableRooms){
let guestRooms = {};
for(let roomName of Object.keys(availableRooms)){
let room = availableRooms[roomName];
let customData = sc.get(room, 'customData', {});
if(sc.isString(customData)){
customData = JSON.parse(customData);
}
// Check if allowGuest is true
if(sc.get(customData, 'allowGuest')){
guestRooms[roomName] = room;
}
}
return guestRooms;
}
```
**Method:** `fetchGuestRooms()` (line 403+)
```javascript
fetchGuestRooms(availableRooms){
// Check global setting
if(this.allowGuestOnRooms){
return availableRooms; // All rooms allow guests
}
// Filter by room-specific allowGuest
return this.filterGuestRooms(availableRooms);
}
```
**Global Setting:**
- Config path: `server/players/guestUser/allowOnRooms`
- Default: `true`
- If `true`, all rooms allow guests
- If `false`, only rooms with `customData.allowGuest = true` allow guests
### 2.3 Config Assignment (`lib/rooms/server/manager.js`)
**Method:** `defineRoomsInGameServer()` (lines 109-116)
```javascript
// After all rooms are loaded and defined
if(this.config.client?.rooms?.selection){
this.config.client.rooms.selection.availableRooms = {
registration: this.registrationAvailableRooms,
registrationGuest: this.registrationAvailableRoomsGuest, // ← Guest rooms here
login: this.loginAvailableRooms,
loginGuest: this.loginAvailableRoomsGuest // ← Guest rooms here
};
}
```
**Called by:** `ServerManager.defineServerRooms()` calls `RoomsManager.defineRoomsInGameServer()`
---
## 3. Config File Generation
### 3.1 Timing (CRITICAL)
**File:** `lib/game/server/manager.js`
**Execution order:**
1. `initializeManagers()` (line 261-263)
- Calls `defineServerRooms()`
- Guest rooms configured in `this.configManager.client.rooms.selection.availableRooms`
2. **Config file created** (line 264-272)
- `HomepageLoader.createConfigFile()` with guest rooms data
3. **Client built** (line 272)
- Bundles config.js into dist folder
### 3.2 Config File Creation (`lib/game/server/homepage-loader.js`)
**Method:** `createConfigFile()` (lines 51-62)
```javascript
static createConfigFile(projectThemePath, initialConfiguration){
let configFilePath = FileHandler.joinPaths(projectThemePath, 'config.js');
let configFileContents = 'window.reldensInitialConfig = '+JSON.stringify(initialConfiguration)+';';
let writeResult = FileHandler.writeFile(configFilePath, configFileContents);
if(!writeResult){
Logger.error('Failed to write config file: '+configFilePath);
return false;
}
Logger.info('Config file created: '+configFilePath);
return true;
}
```
**Output file:** `theme/config.js`
**Content structure:**
```javascript
window.reldensInitialConfig = {
gameEngine: { /* ... */ },
client: {
rooms: {
selection: {
availableRooms: {
registration: { /* normal rooms */ },
registrationGuest: { /* guest-allowed rooms */ }, // ← KEY DATA
login: { /* normal rooms */ },
loginGuest: { /* guest-allowed rooms */ } // ← KEY DATA
}
}
}
}
};
```
---
## 4. Client-Side Flow
### 4.1 Config Loading (`lib/game/client/game-manager.js`)
**Constructor** (line 48-94)
```javascript
constructor(){
this.config = new ConfigManager();
let initialConfig = this.gameDom.getWindow()?.reldensInitialConfig || {};
sc.deepMergeProperties(this.config, initialConfig); // ← Loads from window.reldensInitialConfig
// ...
}
```
**Data source:** `window.reldensInitialConfig` from `theme/config.js`
### 4.2 Client Start (`lib/game/client/handlers/client-start-handler.js`)
**Method:** `clientStart()` (line 30-53)
```javascript
clientStart(){
let registrationForm = new RegistrationFormHandler(this.gameManager);
registrationForm.activateRegistration();
let guestForm = new GuestFormHandler(this.gameManager); // ← Guest handler
guestForm.activateGuest(); // ← Activates guest form
// ... other handlers
}
```
**Called by:** `GameManager.clientStart()` on `DOMContentLoaded`
### 4.3 Guest Form Activation (`lib/game/client/handlers/guest-form-handler.js`)
**Method:** `activateGuest()` (lines 34-72)
```javascript
activateGuest(){
if(!this.form){
return false;
}
// Get guest rooms from config
let availableGuestRooms = this.gameManager.config.getWithoutLogs(
'client/rooms/selection/availableRooms/registrationGuest', // ← Config path
{}
);
// Check if guest login is allowed AND guest rooms exist
if(
!this.gameManager.config.get('client/general/users/allowGuest')
|| 0 === Object.keys(availableGuestRooms).length // ← CRITICAL CHECK
){
this.form.classList.add('hidden'); // ← HIDE FORM
return true;
}
// Form is visible, activate submit handler
this.form.addEventListener('submit', (e) => {
e.preventDefault();
if(!this.form.checkValidity()){
return false;
}
this.form.querySelector(selectors.LOADING_CONTAINER).classList.remove(GameConst.CLASSES.HIDDEN);
let randomGuestName = 'guest-'+sc.randomChars(12);
let userName = this.gameManager.config.getWithoutLogs('client/general/users/allowGuestUserName', false)
? this.gameDom.getElement(selectors.GUEST.USERNAME).value
: randomGuestName;
let formData = {
formId: this.form.id,
username: userName,
password: userName,
rePassword: userName,
isGuest: true
};
this.gameManager.startGame(formData, true);
});
return true;
}
```
**Form element:** `#guest-form` in `theme/default/index.html`
**Key logic:**
- If `availableGuestRooms` is empty: form hidden
- If `client/general/users/allowGuest` is false: form hidden
- Otherwise: form visible and functional
---
## 5. Complete Flow Diagram
**Step 1: DATABASE (rooms table)**
- customData: {"allowGuest": true}
**Step 2: SERVER - RoomsManager.loadRooms()**
- Loads all rooms from database
- Calls filterGuestRooms() to identify guest-allowed rooms
- Creates registrationAvailableRoomsGuest list
**Step 3: SERVER - RoomsManager.defineRoomsInGameServer()**
- Assigns guest rooms to config:
- config.client.rooms.selection.availableRooms = {
- registrationGuest: [...],
- loginGuest: [...]
- }
**Step 4: SERVER - ServerManager.startGameServerInstance()**
- After initializeManagers() completes
- Calls HomepageLoader.createConfigFile()
- Writes theme/config.js with guest rooms data
- Calls themeManager.buildClient()
- Bundles config.js into dist/
**Step 5: CLIENT - Browser loads theme/default/index.html**
- Includes script src="config.js"
- Sets window.reldensInitialConfig
**Step 6: CLIENT - GameManager constructor**
- Reads window.reldensInitialConfig
- Merges into this.config
**Step 7: CLIENT - ClientStartHandler.clientStart()**
- Creates GuestFormHandler
- Calls activateGuest()
**Step 8: CLIENT - GuestFormHandler.activateGuest()**
- Reads config.get('client/rooms/selection/availableRooms/registrationGuest')
- If empty: HIDE form
- If not empty: SHOW form and attach submit handler
---
## 6. Configuration Options
### Server-Side Configs
**Path:** `server/players/guestUser/allowOnRooms`
- **Type:** Boolean
- **Default:** `true`
- **Effect:** If `true`, all rooms allow guests (ignores `customData.allowGuest`)
**Path:** `server/players/guestsUser/emailDomain`
- **Type:** String
- **Default:** `@guest-reldens.com`
- **Effect:** Email domain for guest accounts
### Client-Side Configs
**Path:** `client/general/users/allowGuest`
- **Type:** Boolean
- **Default:** Set from server config
- **Effect:** Master switch for guest login feature
**Path:** `client/general/users/allowGuestUserName`
- **Type:** Boolean
- **Default:** `false`
- **Effect:** If `true`, allows guests to choose username; if `false`, generates random username
### Environment Variables
**Variable:** `RELDENS_CREATE_CONFIG_FILE`
- **Type:** Number (0 or 1)
- **Default:** `1`
- **Effect:** Controls whether config.js file is created after rooms are configured
**Variable:** `RELDENS_GUESTS_EMAIL_DOMAIN`
- **Type:** String
- **Default:** `@guest-reldens.com`
- **Effect:** Email domain for guest user accounts
---
## 7. Testing Guest System
### Database Setup
```sql
-- Enable guest on specific room
UPDATE rooms
SET customData = '{"allowGuest": true}'
WHERE name = 'town';
-- Disable guest on specific room
UPDATE rooms
SET customData = '{"allowGuest": false}'
WHERE name = 'forest';
```
---
## 8. Code References
**Key Files:**
- `lib/rooms/server/manager.js` - Room loading and guest filtering
- `lib/game/server/manager.js` - Config file creation timing
- `lib/game/server/homepage-loader.js` - Config file generation
- `lib/game/client/game-manager.js` - Config loading
- `lib/game/client/handlers/client-start-handler.js` - Form initialization
- `lib/game/client/handlers/guest-form-handler.js` - Guest form logic
**Database:**
- Table: `rooms`
- Column: `customData` (JSON)
- Field: `allowGuest` (boolean)
**Config Paths:**
- Server: `server/players/guestUser/allowOnRooms`
- Server: `server/players/guestsUser/emailDomain`
- Client: `client/general/users/allowGuest`
- Client: `client/general/users/allowGuestUserName`
- Client: `client/rooms/selection/availableRooms/registrationGuest`
- Client: `client/rooms/selection/availableRooms/loginGuest`
================================================
FILE: .claude/installer-guide.md
================================================
# Installer Guide
Complete guide for the Reldens web-based installation wizard.
## Overview
The Reldens installer (`lib/game/server/installer.js`) provides a web-based GUI for setting up new Reldens installations. It handles database setup, entity generation, storage driver configuration, and project file creation.
## Accessing the Installer
The installer runs automatically on the first launch when no installation lock file exists:
```bash
npm start
# Navigate to http://localhost:8080 (or configured host/port)
```
The installer will automatically redirect to the installation wizard if the project has not been installed yet.
## Storage Drivers & Database Clients
Reldens supports three storage drivers with multiple database clients:
### Prisma Driver
- **mysql** - MySQL database (automated installation)
- **postgresql (manual)** - PostgreSQL database
- **sqlite (manual)** - SQLite database
- **sqlserver (manual)** - SQL Server database
- **mongodb (manual)** - MongoDB database
- **cockroachdb (manual)** - CockroachDB database
### Objection-js Driver (Knex.js)
- **mysql (native)** - MySQL with native driver (automated installation)
- **mysql2 (recommended)** - MySQL with mysql2 driver (automated installation)
- **pg (manual)** - PostgreSQL
- **sqlite3 (manual)** - SQLite3
- **better-sqlite3 (manual)** - Better-SQLite3
- **mssql (manual)** - SQL Server
- **oracledb (manual)** - Oracle DB
- **cockroachdb (manual)** - CockroachDB
### MikroORM Driver
- **mysql** - MySQL database (automated installation)
- **mariadb (manual)** - MariaDB database
- **postgresql (manual)** - PostgreSQL database
- **sqlite (manual)** - SQLite database
- **mongodb (manual)** - MongoDB database
- **mssql (manual)** - SQL Server
- **better-sqlite3 (manual)** - Better-SQLite3
## Automated vs Manual Installation
### Automated Installation (MySQL Only)
Only MySQL clients support automated installation scripts:
- `mysql` (all drivers)
- `mysql2` (objection-js only)
**Automated steps:**
1. Creates database tables via `reldens-install-v4.0.0.sql`
2. Installs basic configuration via `reldens-basic-config-v4.0.0.sql` (if checked)
3. Installs sample data via `reldens-sample-data-v4.0.0.sql` (if checked)
4. Generates entities from database schema
5. Creates project configuration files
### Manual Installation (All Other Clients)
Clients marked with **(manual)** require manual database setup:
- PostgreSQL, SQLite, MongoDB, SQL Server, Oracle, CockroachDB, MariaDB, Better-SQLite3
**Manual steps:**
1. Installer skips SQL script execution
2. User must manually create database tables and schema
3. Installer generates entities from existing database
4. Installer creates project configuration files
**Manual Setup Process:**
1. Select a manual client from the installer
2. Complete the installation wizard
3. Manually execute SQL scripts or create schema in your database:
- Copy SQL files from `migrations/production/` directory
- Adapt SQL syntax for your database (if needed)
- Execute scripts in order: install, basic-config, sample-data
4. Run entity generation: `reldens generateEntities --override`
5. Restart the application
## Installation Process Flow
### For MySQL Clients
1. **Package Installation** (if enabled)
- Status: "Checking and installing required packages..."
- Installs `@reldens/storage` and driver-specific packages
2. **Database Connection**
- Status: "Configuring database connection..."
- Tests connection with provided credentials
3. **Driver Installation**
- Status: "Installing database driver: {driver}..."
- Executes SQL migration scripts
- Creates tables, basic config, sample data
4. **Entity Generation**
- Status: "Generating entities from database schema..."
- Introspects database and generates entity classes
5. **Project Files**
- Status: "Creating project files..."
- Creates `.env`, `knexfile.js`, `index.js`, etc.
6. **Completion**
- Status: "Installation completed successfully!"
- Redirects to game
### For Manual Clients
1. **Package Installation** (if enabled)
2. **Database Connection**
3. **Driver Installation**
- Status: "Installing database driver: {driver}..."
- Logs: "Non-MySQL client detected ({client}), skipping automated SQL scripts."
- Skips all SQL migrations
4. **Entity Generation** (requires pre-existing database schema)
5. **Project Files**
6. **Completion**
## Status Tracking
The installer provides real-time status updates during installation:
- Status file: `dist/assets/install-status.json`
- Format: `{message: string, timestamp: number}`
- Frontend polls every 2 seconds
- Status messages appear beside/below loading image
**Status Messages:**
- "Starting installation process..."
- "Checking and installing required packages..."
- "Configuring database connection..."
- "Installing database driver: {driver}..."
- "Generating entities from database schema..."
- "Creating project files..."
- "Installation completed successfully!"
## Configuration Options
### App Settings
- **Host** - Server host URL (e.g., http://localhost)
- **Port** - Server port (default: 8080)
- **Public URL** - Public-facing URL (for reverse proxies)
- **Trusted Proxy** - Reverse proxy address
- **Admin Panel Path** - Admin interface route (default: /reldens-admin)
- **Admin Panel Secret Key** - Secret key for admin access
- **Hot-Plug** - Enable runtime configuration reload
### Storage Settings
- **Storage Driver** - Database ORM (prisma, objection-js, mikro-orm)
- **Client** - Database client library (see list above)
- **Host** - Database server host
- **Port** - Database server port
- **Database Name** - Database name
- **Username** - Database user
- **Password** - Database password
- **Install minimal configuration** - MySQL only
- **Install sample data** - MySQL only
### Optional Features
- **HTTPS** - SSL/TLS configuration
- **Monitor** - Colyseus monitoring tools
- **Mailer** - Email service integration (SendGrid, NodeMailer)
- **Firebase** - Firebase authentication integration
## Installer Architecture
### Core Classes
**Installer** (`lib/game/server/installer.js`)
- Main orchestration class
- Handles Express routes and form processing
- Coordinates sub-installers
- Manages status tracking
**GenericDriverInstallation** (`lib/game/server/installer/generic-driver-installation.js`)
- Handles ObjectionJS and MikroORM installations
- Executes SQL migrations via `rawQuery()`
- Checks client type and skips non-MySQL scripts
**PrismaInstallation** (`lib/game/server/installer/prisma-installation.js`)
- Handles Prisma-specific installation
- Runs installation in forked subprocess
- Generates Prisma schema and client
**PrismaSubprocessWorker** (`lib/game/server/installer/prisma-subprocess-worker.js`)
- Forked child process for Prisma installation
- Isolates Prisma client to avoid module caching
- Checks client type and skips non-MySQL scripts
**EntitiesInstallation** (`lib/game/server/installer/entities-installation.js`)
- Generates entity classes from database schema
- Supports all three storage drivers
**ProjectFilesCreation** (`lib/game/server/installer/project-files-creation.js`)
- Creates `.env` file with configuration
- Creates `knexfile.js` for ObjectionJS
- Creates `index.js` entry point
- Copies theme files and assets
**PackagesInstallation** (`lib/game/server/installer/packages-installation.js`)
- Manages npm package installation and linking based on `RELDENS_INSTALLATION_TYPE`
- Reads the lock file at construction time (while the main package link is still active)
- Runs installs before links so the main package link is always restored last
- Handles driver-specific dependencies (e.g. `@prisma/client` for Prisma)
**Installation Types** (set via `RELDENS_INSTALLATION_TYPE` environment variable):
- `normal` — installs `reldens` from npm registry; no linking
- `link` — npm links `reldens` and all `@reldens/*` packages; no npm installs
- `link-main` — npm installs all `@reldens/*` packages from registry (no version pinning), then npm links `reldens` last to restore the local source junction
**Package installation sequence** (`link-main`):
1. Lock file is read from `node_modules/reldens/package-lock.json` at construction (while link is active)
2. `unlinkAllPackages()` removes all existing links for `reldens` and all `@reldens/*` packages
3. `checkAndInstallPackages()` runs installs first, then the link:
- `npm install @reldens/cms`, `npm install @reldens/storage`, etc. (no version pinning)
- `npm link reldens` — restores the junction to the local source last
4. With the junction restored, `migrations/production/` resolves correctly through the link to the local source SQL files
### Frontend Files
**install/index.html**
- Installation form with all configuration fields
- Client dropdown populated by JavaScript
- Form validation and submission
**install/index.js**
- Database client mapping (`DB_CLIENTS_MAP`)
- Dynamic client dropdown updates
- Status polling functionality
- Form submission handling
**install/css/styles.scss**
- Installer styling
## MySQL-Only Scripts
The following SQL migration files only work with MySQL:
- `migrations/production/reldens-install-v4.0.0.sql`
- `migrations/production/reldens-basic-config-v4.0.0.sql`
- `migrations/production/reldens-sample-data-v4.0.0.sql`
For other databases, these scripts must be manually adapted to the target database syntax.
## Troubleshooting
### "Non-MySQL client detected, skipping automated SQL scripts"
**Cause:** Selected a manual database client (PostgreSQL, SQLite, MongoDB, etc.)
**Solution:**
1. Complete the installer wizard
2. Manually set up database schema
3. Run entity generation
4. Restart application
### "Connection failed, please check the storage configuration"
**Cause:** Invalid database credentials or unreachable database server
**Solution:**
1. Verify database server is running
2. Check host, port, username, password
3. Ensure database exists
4. Check firewall/network settings
### "Entities generation failed"
**Cause:** Database schema not found or invalid
**Solution:**
1. For MySQL: Ensure installation scripts ran successfully
2. For manual clients: Verify you created all required tables
3. Check database connection
4. Ensure user has schema read permissions
### "Required packages installation failed"
**Cause:** npm install failed or network issues
**Solution:**
1. Check internet connection
2. Manually run: `npm install @reldens/storage`
3. For Prisma: `npm install @prisma/client`
4. Check npm logs for errors
## Post-Installation
After successful installation:
1. Application redirects to game
2. Lock file created at configured path
3. Installer becomes inaccessible
4. Use admin panel for further configuration
5. Access admin at configured path (default: /reldens-admin)
6. Use configured admin secret key for first login
## Re-installation
To re-run the installer:
1. Stop the application
2. Delete the installation lock file (location configured in ThemeManager)
3. Optionally drop and recreate database
4. Start application and navigate to installation wizard
================================================
FILE: .claude/items-system-implementation.md
================================================
# Items System Implementation - Complete Documentation
## Overview
The Reldens Items System manages player inventory, equipment, and item modifiers. It uses the `@reldens/items-system` package for core functionality and integrates with the `@reldens/modifiers` package for stat modifications.
## Architecture
### Core Components
1. **ItemsServer** (`@reldens/items-system`) - Server-side inventory manager
2. **Inventory** (`@reldens/items-system`) - Base inventory container
3. **ItemBase** - Base class for all items
4. **Equipment** - Specialized item type for equippable items
5. **Modifier** (`@reldens/modifiers`) - Handles stat modifications
6. **StorageObserver** - Persists inventory changes to database
### Directory Structure
**lib/inventory/**
- **client/** - Client-side inventory UI and rendering
- **server/** - Server-side inventory logic
- items-factory.js - Creates item instances from database models
- message-actions.js - Handles equip/unequip/trade messages
- models-manager.js - Database operations
- storage-observer.js - Event listeners for persistence
- plugin.js - Inventory feature plugin
- **subscribers/** - Event subscribers
- player-subscriber.js - Creates player inventory on login
- player-death-subscriber.js
- constants.js
## Item Creation Flow
### When Player Logs In
**Entry Point**: `lib/inventory/server/plugin.js` line 50-51
```javascript
this.events.on('reldens.createPlayerStatsAfter', async (client, userModel, currentPlayer, room) => {
await PlayerSubscriber.createPlayerInventory(client, currentPlayer, room, this.events, this.modelsManager);
});
```
**Sequence**:
1. **Player Stats Loaded** (`lib/users/server/plugin.js` lines 289-309)
- Stats loaded from `players_stats` table
- Set on `currentPlayer.stats` and `currentPlayer.statsBase`
- Event `reldens.createPlayerStatsAfter` fires
2. **Inventory Creation** (`lib/inventory/server/subscribers/player-subscriber.js` lines 30-63)
```javascript
let serverProps = {
owner: currentPlayer, // The player schema instance
client: new ClientWrapper({client, room}),
persistence: true,
ownerIdProperty: 'player_id',
eventsManager: events,
modelsManager: modelsManager,
itemClasses: {...},
groupClasses: {...},
itemsModelData: room.config.inventory.items
};
let inventoryServer = new ItemsServer(serverProps);
inventoryServer.dataServer = new StorageObserver(inventoryServer.manager, modelsManager);
```
3. **Items Loading** (`lib/inventory/server/storage-observer.js` lines 169-182)
```javascript
async loadOwnerItems(){
let itemsModels = await this.modelsManager.loadOwnerItems(this.manager.getOwnerId());
let itemsInstances = await ItemsFactory.fromModelsList(itemsModels, this.manager);
await this.manager.fireEvent(ItemsEvents.LOADED_OWNER_ITEMS, this, itemsInstances, itemsModels);
await this.manager.setItems(itemsInstances);
}
```
4. **Item Instance Creation** (`lib/inventory/server/items-factory.js` lines 40-71)
```javascript
static async fromModel(itemInventoryModel, manager){
let itemClass = sc.get(
manager.itemClasses,
itemInventoryModel.related_items_item.key,
manager.types.classByTypeId(itemInventoryModel.related_items_item.type)
);
let itemObj = new itemClass(itemProps);
if (itemObj.isType(ItemsConst.TYPES.EQUIPMENT)) {
itemObj.equipped = (1 === itemInventoryModel.is_active); // Mark as equipped if active
}
await this.enrichWithModifiers(itemInventoryModel, itemObj, manager);
return itemObj;
}
```
5. **Modifier Creation** (`lib/inventory/server/items-factory.js` lines 79-93)
```javascript
static async enrichWithModifiers(itemInventoryModel, itemObj, manager){
let modifiers = {};
for(let modifierData of itemInventoryModel.related_items_item.related_items_item_modifiers){
if(modifierData.operation !== ModifierConst.OPS.SET){
modifierData.value = Number(modifierData.value);
}
modifierData.target = manager.owner; // Set target to currentPlayer
modifiers[modifierData.id] = new Modifier(modifierData);
}
itemObj.modifiers = modifiers;
}
```
### Critical Timing
- **BEFORE items load**: `currentPlayer.stats` is set (fresh object from database)
- **DURING item creation**: Modifiers get `target = manager.owner = currentPlayer`
- **AFTER items load**: Modifiers have correct reference to `currentPlayer.stats`
## Equipment Flow
### Manual Equip (User Action)
**Entry Point**: User clicks equip button, client sends message, server receives
1. **Message Reception** (`lib/inventory/server/message-actions.js` lines 71-73)
```javascript
if(InventoryConst.ACTIONS.EQUIP === data.act){
return await this.executeEquipAction(playerSchema, data);
}
```
2. **Execute Equip Action** (`lib/inventory/server/message-actions.js` lines 360-373)
```javascript
async executeEquipAction(playerSchema, data){
let item = playerSchema.inventory.manager.items[data.idx];
if(!item.equipped){
this.unEquipPrevious(item.group_id, playerSchema.inventory.manager.items); // Unequip same group
await item.equip(); // Equip new item
return true;
}
await item.unequip(); // If already equipped, unequip
return true;
}
```
3. **Item Equip Method** (`npm-packages/reldens-items/lib/item/type/equipment.js` lines 26-35)
```javascript
async equip(applyMods){
this.equipped = true;
await this.manager.fireEvent(ItemsEvents.EQUIP_ITEM, this);
if(applyMods === false || this.manager.applyModifiersAuto === false){
return false;
}
await this.applyModifiers(); // Apply modifiers automatically
}
```
4. **Apply Modifiers** (`npm-packages/reldens-items/lib/item/type/item-base.js` lines 90-105)
```javascript
async changeModifiers(revert){
await this.manager.fireEvent(ItemsEvents.EQUIP_BEFORE+(revert ? 'Revert': 'Apply')+'Modifiers', this);
let modifiersKeys = Object.keys(this.modifiers);
let methodName = revert ? 'revert' : 'apply';
for(let i of modifiersKeys){
this.modifiers[i][methodName](this.target); // this.target is false, but modifier has its own target
}
return this.manager.fireEvent(ItemsEvents.EQUIP+(revert ? 'Reverted' : 'Applied')+'Modifiers', this);
}
```
5. **Modifier Execute** (`npm-packages/reldens-modifiers/lib/modifier.js` lines 84-108)
```javascript
execute(target, revert = false, useBasePropertyToGetValue = false, applyOnBaseProperty = false){
// If target param is false, use this.target (set to currentPlayer in factory)
if(target){
this.target = target;
}
let newValue = this.getModifiedValue(revert, useBasePropertyToGetValue);
let applyToProp = applyOnBaseProperty ? this.basePropertyKey : this.propertyKey;
this.setOwnerProperty(applyToProp, newValue); // Sets currentPlayer.stats.atk
this.state = revert ? ModifierConst.MOD_REVERTED : ModifierConst.MOD_APPLIED;
return true;
}
```
6. **Property Manager Sets Value** (`npm-packages/reldens-modifiers/lib/property-manager.js` lines 22-34)
```javascript
manageOwnerProperty(propertyOwner, propertyString, value){
let propertyPathParts = propertyString.split('/'); // ['stats', 'atk']
let childPropertyOwner = this.extractChildPropertyOwner(propertyOwner, propertyPathParts); // Get stats object
let propertyKey = propertyPathParts[propertyPathParts.length-1]; // 'atk'
if('undefined' === typeof value && !sc.hasOwn(childPropertyOwner, propertyKey)){
ErrorManager.error('Invalid property "'+propertyKey+'" from path: "'+propertyPathParts.join('/')+'"].');
}
if('undefined' !== typeof value){
childPropertyOwner[propertyKey] = value; // Sets stats.atk = newValue
}
return childPropertyOwner[propertyKey];
}
```
7. **Stats Persistence** (`lib/inventory/server/storage-observer.js` lines 68-79)
```javascript
this.manager.listenEvent(
ItemsEvents.EQUIP+'AppliedModifiers',
this.updateAppliedModifiers.bind(this),
...
);
async updateAppliedModifiers(item){
return await this.modelsManager.onChangedModifiers(item, ModifierConst.MOD_APPLIED);
}
```
8. **Persist Data** (`lib/inventory/server/models-manager.js` lines 127-131)
```javascript
async onChangedModifiers(item, action){
return await item.manager.owner.persistData({act: action, item: item});
}
```
9. **Save Player Stats** (`lib/rooms/server/scene.js` lines 228-234)
```javascript
currentPlayer.persistData = async (params) => {
await this.savePlayedTime(currentPlayer);
await this.savePlayerState(currentPlayer.sessionId);
await this.savePlayerStats(currentPlayer, client); // Saves stats to database
};
```
10. **Client Update** (`lib/rooms/server/scene.js` lines 759-763)
```javascript
client.send('*', {
act: GameConst.PLAYER_STATS,
stats: playerSchema.stats,
statsBase: playerSchema.statsBase
});
```
## Modifier Operations
From `@reldens/modifiers/lib/constants.js`:
**1. INC - Increase (flat)**
- Apply: `value + operand`
- Revert: `value - operand`
**2. DEC - Decrease**
- Apply: `value - operand`
- Revert: `value + operand`
**3. DIV - Divide**
- Apply: `value / operand`
- Revert: `value * operand`
**4. MUL - Multiply**
- Apply: `value * operand`
- Revert: `value / operand`
**5. INC_P - Increase by %**
- Apply: `value + (value * operand / 100)`
- Revert: Complex percentage revert
**6. DEC_P - Decrease by %**
- Apply: `value - (value * operand / 100)`
- Revert: Complex percentage revert
**7. SET - Set value**
- Apply: `operand`
- Revert: `false`
**8. METHOD - Custom method**
- Apply: Calls custom method on modifier
- Revert: Calls custom method
**9. SET_N - Set (alt)**
- Apply: `operand`
- Revert: `false`
### INC_P (Increase Percentage) Calculation
From `@reldens/modifiers/lib/calculator.js` lines 30-37:
**Apply**:
```javascript
return originalValue + Math.round(originalValue * operationValue / 100);
```
Example: atk=100, value=5 results in 100 + Math.round(100 * 5 / 100) = 100 + 5 = 105
**Revert**:
```javascript
let revertValue = Math.ceil(originalValue - (originalValue / (100 - operationValue)) * 100);
return originalValue + revertValue;
```
Example: atk=105, value=5 results in Math.ceil(105 - (105/95)*100) = Math.ceil(-5.26) = -5 then 105 + (-5) = 100
## Database Schema
### items_item (Item Definitions)
```sql
CREATE TABLE `items_item` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`key` varchar(255) NOT NULL,
`type` int(11) NOT NULL,
`group_id` int(10) unsigned DEFAULT NULL,
`label` varchar(255) DEFAULT NULL,
`description` text,
`qty_limit` int(11) DEFAULT NULL,
`uses_limit` int(11) DEFAULT NULL,
`useTimeOut` int(11) DEFAULT NULL,
`execTimeOut` int(11) DEFAULT NULL,
`customData` text,
PRIMARY KEY (`id`)
);
```
### items_item_modifiers (Item Modifier Definitions)
```sql
CREATE TABLE `items_item_modifiers` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`item_id` int(10) unsigned NOT NULL,
`key` varchar(255) NOT NULL,
`property_key` varchar(255) NOT NULL,
`operation` int(11) NOT NULL,
`value` varchar(255) NOT NULL,
`maxProperty` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`)
);
```
- `item_id`: References the item this modifier belongs to
- `key`: Modifier identifier (e.g., 'atk')
- `property_key`: Path to property to modify (e.g., 'stats/atk')
- `operation`: Operation ID (1-9, see Modifier Operations table)
- `value`: Value to apply (as string, converted to number if not SET operation)
- `maxProperty`: Optional max value property path (e.g., 'statsBase/hp')
### items_inventory (Player Item Instances)
```sql
CREATE TABLE `items_inventory` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`owner_id` int(10) unsigned NOT NULL,
`item_id` int(10) unsigned NOT NULL,
`qty` int(11) NOT NULL,
`remaining_uses` int(11) DEFAULT NULL,
`is_active` tinyint(1) DEFAULT 0,
PRIMARY KEY (`id`),
FOREIGN KEY (`owner_id`) REFERENCES `players` (`id`),
FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`)
);
```
- `owner_id`: Player ID who owns this item instance
- `item_id`: References the item definition
- `qty`: Quantity (-1 for unlimited)
- `remaining_uses`: Uses left (if item has uses limit)
- `is_active`: 1 if equipped, 0 if not (for equipment items only)
## Event Flow
### Equipment Events Sequence
1. `ItemsEvents.EQUIP_ITEM` - Fired when equip() starts
- **Listener**: `StorageObserver.saveEquippedItemAsActive()` - Updates `is_active=1` in database
2. `ItemsEvents.EQUIP_BEFORE+'Apply'+'Modifiers'` - Before modifiers are applied
- No default listeners
3. `ItemsEvents.EQUIP+'Applied'+'Modifiers'` - After modifiers are applied
- **Listener**: `StorageObserver.updateAppliedModifiers()` - Calls `persistData()` to save stats
4. `reldens.playerPersistDataBefore` - Before data persistence
- Custom hooks can intercept here
5. `reldens.savePlayerStatsUpdateClient` - After stats saved, before client update
- **Listener**: `UsersPlugin.updateClientsWithPlayerStats()` - Updates life bar UI
6. Client receives `GameConst.PLAYER_STATS` message with updated stats
### Unequip Events Sequence
1. `ItemsEvents.UNEQUIP_ITEM` - Fired when unequip() starts
- **Listener**: `StorageObserver.saveUnequippedItemAsInactive()` - Updates `is_active=0` in database
2. `ItemsEvents.EQUIP_BEFORE+'Revert'+'Modifiers'` - Before modifiers are reverted
- No default listeners
3. `ItemsEvents.EQUIP+'Reverted'+'Modifiers'` - After modifiers are reverted
- **Listener**: `StorageObserver.updateRevertedModifiers()` - Calls `persistData()` to save stats
4-6. Same persistence and client update flow as equip
## Testing Checklist
- Equip item - Stats increase correctly
- Unequip item - Stats revert to base value
- Logout with equipped item - Stats saved correctly
- Login with equipped item - Stats loaded with modifiers applied
- Unequip after login - Stats revert to base value correctly
- Multiple items in same group - Only one equipped at a time
- Percentage modifiers - Calculate correctly for different base values
- Flat modifiers - Add/subtract exact values
- Max/min property limits - Respect statsBase maximums
## Performance Considerations
- Modifiers are applied synchronously in a loop (item-base.js line 101-103)
- For items with many modifiers, this could cause brief delay
- Stats are saved to database after every equip/unequip operation
- Consider batching stats updates if players frequently swap equipment
## Extension Points
### Custom Item Types
Create custom item class extending ItemBase or Equipment:
```javascript
const Equipment = require('@reldens/items-system').ItemBase;
class MagicWeapon extends Equipment {
async equip(applyMods){
// Custom equip logic
await super.equip(applyMods);
// Post-equip custom logic
}
}
```
Register in `server/customClasses/inventory/items`:
```javascript
itemClasses: {
'magic_sword': MagicWeapon
}
```
### Custom Modifiers
Create custom modifier with METHOD operation:
```javascript
const { Modifier } = require('@reldens/modifiers');
class CustomModifier extends Modifier {
customCalculation(modifier, propertyValue){
// Your custom logic
return newValue;
}
}
```
Set in database:
```sql
INSERT INTO items_item_modifiers VALUES (
NULL, item_id, 'custom', 'stats/custom', 8, 'customCalculation', NULL
);
```
### Event Hooks
Hook into any event for custom logic:
```javascript
events.on('reldens.createdPlayerSchema', async (client, userModel, currentPlayer, room) => {
// Custom logic when player is created
});
inventoryServer.manager.listenEvent(ItemsEvents.EQUIP_ITEM, async (item) => {
// Custom logic when any item is equipped
});
```
## References
- `@reldens/items-system` package: D:\dap\work\reldens\npm-packages\reldens-items
- `@reldens/modifiers` package: D:\dap\work\reldens\npm-packages\reldens-modifiers
- Sample data: D:\dap\work\reldens\src\migrations\production\reldens-sample-data-v4.0.0.sql
================================================
FILE: .claude/player-state-flow.md
================================================
# Player State Flow - Complete Technical Guide
## Overview
This document explains the complete player state management system in Reldens, including the database entity refactor that introduced the "related_" naming convention, and how player state flows from database to runtime.
---
## Architecture Layers
### 1. Database Layer (Persistent Storage)
After the entity refactor, all database relations use the **"related_" prefix** (this is the NEW/CURRENT convention, NOT legacy):
```javascript
UsersModel {
id: number,
email: string,
username: string,
password: string,
role_id: number,
// NEW: Database relations with "related_" prefix
related_users_login: UsersLoginModel[],
related_players: PlayersModel[] // ← Array of all players for this user
}
PlayersModel {
id: number,
user_id: number,
name: string,
created_at: Date,
updated_at: Date,
// NEW: Player state from database (persistent)
related_players_state: PlayersStateModel {
id: number,
player_id: number,
room_id: number, // ← Last SAVED room
x: number, // ← Last SAVED position
y: number,
dir: string
// NOTE: NO scene property in database model!
}
}
```
**Key Points:**
- `related_players` is an **array** (users can have multiple characters)
- `related_players_state` is the **database snapshot** of player position
- Database model does NOT include `scene` property (only `room_id`)
---
### 2. Runtime Layer (In-Memory During Gameplay)
During login and gameplay, additional properties are added for runtime state management:
```javascript
// After login processing:
userModel {
...database fields,
related_players: PlayersModel[], // From database
// ADDED AT RUNTIME: Selected player reference
player: PlayersModel { // ← Selected from related_players[]
...database fields,
related_players_state: { ... }, // Database snapshot
// ADDED AT RUNTIME: Enhanced runtime state
state: {
room_id: number, // ← CURRENT room (updated during gameplay)
x: number, // ← CURRENT position
y: number,
dir: string,
scene: string // ← ADDED: Room name (not in database!)
}
}
}
```
**Key Points:**
- `userModel.player` is **assigned at runtime** from `related_players[]`
- `player.state` is **created during login** and updated during gameplay
- `player.state.scene` is **added by server**, not from database
- `related_players_state` remains **unchanged** after initial load (becomes stale)
---
## Complete Login Flow
### Step 1: User Authentication
**File:** `lib/rooms/server/login.js:70-107` (onAuth)
```javascript
async onAuth(client, options, request) {
// Load user from database
let loginResult = await this.loginManager.processUserRequest(options);
// Select player if specified
if(sc.hasOwn(options, 'selectedPlayer')){
loginResult.user.player = this.getPlayerByIdFromArray(
loginResult.user.related_players, // ← From database array
options.selectedPlayer
);
}
return loginResult.user; // ← Becomes userModel in onJoin
}
```
### Step 2: Load User From Database
**File:** `lib/users/server/manager.js:67-83`
```javascript
async loadUserByUsername(username) {
let loadedUser = await this.usersRepository.loadOneByWithRelations(
'username',
username,
['related_users_login', 'related_players.related_players_state']
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Loads players WITH their state from DB
);
return loadedUser;
}
```
**Result:** User loaded with `related_players[]` array, each player has `related_players_state` from database.
### Step 3: Map Player State Relation
**File:** `lib/game/server/login-manager.js:351-361`
```javascript
mapPlayerStateRelation(user) {
if(!sc.isArray(user.related_players)){
return;
}
for(let player of user.related_players){
if(player.related_players_state && !player.state){
// Create runtime state from database state
player.state = player.related_players_state;
}
}
}
```
**CRITICAL:** This creates `player.state` by assigning `player.related_players_state`.
**Question:** Is this assignment by reference or copy?
- In JavaScript, object assignment is **by reference**
- BUT: Database ORM models might be immutable/frozen
- **Result:** They can diverge during gameplay
### Step 4: Set Scene On Players
**File:** `lib/game/server/login-manager.js:423-441`
```javascript
async setSceneOnPlayers(user, userData) {
for(let player of user.related_players){
if(!player.state){
continue;
}
// Check if user selected a different scene on login
let config = this.config.get('client/rooms/selection');
if(config.allowOnLogin && userData['selectedScene'] &&
userData['selectedScene'] !== RoomsConst.ROOM_LAST_LOCATION_KEY){
await this.applySelectedLocation(player, userData['selectedScene']);
}
// CRITICAL: Add scene property to state
player.state.scene = await this.getRoomNameById(player.state.room_id);
// ^^^^^ ADDED HERE - not in database!
}
}
```
**Result:** Each player now has `player.state.scene` with the room name string.
### Step 5: Select Player (Runtime Assignment)
**File:** `lib/rooms/server/login.js:89-91`
```javascript
if(sc.hasOwn(options, 'selectedPlayer')){
loginResult.user.player = this.getPlayerByIdFromArray(
loginResult.user.related_players,
options.selectedPlayer
);
}
```
**Result:** `userModel.player` now references ONE player from the array with both:
- `player.related_players_state` (database snapshot)
- `player.state` (runtime state with scene)
---
## Gameplay Flow
### Joining Scene Room
**File:** `lib/rooms/server/scene.js:126-156`
```javascript
async onJoin(client, options, userModel) {
// userModel already has player selected from onAuth
// Validate using RUNTIME state (not database state!)
if(this.validateRoomData){
if(!userModel.player.state){ // ← Check runtime state exists
Logger.warning('Missing user player state.', userModel);
return false;
}
if(!this.validateRoom(userModel.player.state.scene, isGuest)){
// ^^^^^ Use runtime state with scene!
return false;
}
}
// Create player schema in room...
}
```
**FIX APPLIED:** Changed from `related_players_state.scene` (doesn't exist) to `state.scene` (exists).
### Saving Player State During Gameplay
**File:** `lib/rooms/server/scene.js:708-737`
```javascript
async savePlayerState(sessionId) {
let playerSchema = this.playerBySessionIdFromState(sessionId);
// Extract CURRENT position from runtime state
let {room_id, x, y, dir} = playerSchema.state; // ← From state, NOT related_players_state
let playerId = playerSchema.player_id;
let updatePatch = {room_id, x: parseInt(x), y: parseInt(y), dir};
// Update database with CURRENT position
updateResult = await this.loginManager.usersManager.updateUserStateByPlayerId(
playerId,
updatePatch
);
return playerSchema;
}
```
**Key Points:**
- Database updated FROM `playerSchema.state` (runtime)
- Database updated TO `players_state` table (will become `related_players_state` on next login)
- `related_players_state` in current session is NEVER updated (remains stale)
---
## Data Flow Diagram
**Step 1: DATABASE (players_state table)**
- room_id: 4, x: 400, y: 345, dir: 'down'
- (NO scene property)
**Step 2: LOAD - UsersManager.loadUserByUsername()**
- related_players[].related_players_state = database snapshot
**Step 3: MAP - LoginManager.mapPlayerStateRelation()**
- player.state = player.related_players_state
- (Assignment creates runtime state)
**Step 4: ENHANCE - LoginManager.setSceneOnPlayers()**
- player.state.scene = getRoomNameById(player.state.room_id)
- (Adds scene property to runtime state)
**Step 5: SELECT - RoomLogin.onAuth()**
- userModel.player = getPlayerByIdFromArray(...)
- (Assigns selected player to userModel.player)
**Step 6: VALIDATE - RoomScene.onJoin()**
- Check: userModel.player.state exists
- Validate: userModel.player.state.scene matches room
**Step 7: GAMEPLAY - Player moves, changes scenes**
- Updates: playerSchema.state (runtime)
- Unchanged: player.related_players_state (stale)
**Step 8: SAVE - RoomScene.savePlayerState()**
- Read FROM: playerSchema.state (current position)
- Write TO: database players_state table
- (Becomes related_players_state on next login)
---
## State Divergence
After login, you have **TWO sources of state** that can diverge:
### Example Session:
**Initial Login:**
```javascript
userModel.player.related_players_state = {
room_id: 4, // Town (from database)
x: 400,
y: 345,
dir: 'down'
}
userModel.player.state = {
room_id: 4, // Same as database
x: 400,
y: 345,
dir: 'down',
scene: 'reldens-town' // Added by server
}
```
**After Scene Change (player moves to house):**
```javascript
userModel.player.related_players_state = {
room_id: 4, // UNCHANGED (stale)
x: 400,
y: 345,
dir: 'down'
}
userModel.player.state = {
room_id: 2, // UPDATED to house
x: 548,
y: 615,
dir: 'up',
scene: 'reldens-house-1' // UPDATED
}
```
**On Logout:** `state` is saved to database, becomes `related_players_state` on next login.
---
## Key Takeaways
1. **"related_" prefix is the NEW database relation naming** (not legacy)
2. **`related_players_state`** = Database snapshot (stale after load, no scene property)
3. **`state`** = Runtime state (active, has scene property, source of truth for gameplay)
4. **`scene` property** = Only exists in runtime `state`, NOT in database model
5. **Validation must use** `player.state.scene`, NOT `player.related_players_state.scene`
6. **Database updates** read from `state` and write to `players_state` table
7. **`related_players_state` is never updated** during a session (snapshot only)
---
## Code References
**Key Files:**
- `lib/users/server/manager.js:67-83` - Load user with relations
- `lib/game/server/login-manager.js:351-361` - Map player state relation
- `lib/game/server/login-manager.js:423-441` - Set scene on players
- `lib/rooms/server/login.js:70-107` - Authentication and player selection
- `lib/rooms/server/scene.js:126-156` - Scene validation
- `lib/rooms/server/scene.js:708-737` - Save player state
**Database Tables:**
- `users` - User accounts
- `players` - Player characters
- `players_state` - Player positions (becomes `related_players_state` when loaded)
**Entity Relations:**
- `UsersModel.related_players` relates to `PlayersModel[]`
- `PlayersModel.related_players_state` relates to `PlayersStateModel`
================================================
FILE: .claude/room-data-optimization.md
================================================
# Room Data Optimization - Scene Data Filter
**Purpose**: Optimize Colyseus schema buffer usage by detecting and extracting shared properties from room objects, reducing data transmission size without losing functionality.
---
## Overview
The SceneDataFilter system prevents Colyseus buffer overflow by analyzing room data and extracting identical properties across multiple objects into a shared defaults structure. This reduces buffer usage from ~176 KB to under 64 KB for rooms with 400+ objects.
**Key Components**:
- **Server**: `SceneDataFilter` (`lib/rooms/server/scene-data-filter.js`) - Detects shared properties, creates optimized data structure
- **Client**: `AnimationsDefaultsMerger` (`lib/game/client/animations-defaults-merger.js`) - Merges defaults back into objects
**Critical Design Principle**: The filter NEVER adds properties to objects. It ONLY extracts existing identical properties to a separate defaults structure.
---
## Server-Side: SceneDataFilter
### Architecture
**SceneDataFilter Methods:**
- filterRoomData() - Main entry (called by State.mapRoomData)
- buildCompleteData() - Returns unfiltered data (sendAll: true)
- buildFilteredData() - Returns optimized data (sendAll: false)
- optimizeData() - Generic optimization method
- detectIdenticalProperties() - Finds shared properties across objects
- valuesAreDifferent() - Compares values for optimization
### How It Works
1. **No Hardcoded Fields**: Filter dynamically detects which fields are identical across objects
2. **Grouping**: Objects are grouped by a shared field for comparison
- `preloadAssets`: Groups by `asset_type` (filters `asset_type === 'spritesheet'`)
- `objectsAnimationsData`: Groups by `asset_key` field, falls back to `key` field if `asset_key` not present
3. **Detection**: For each group with 2+ objects, detects properties with identical values across ALL objects
4. **Extraction**: Identical properties extracted to defaults object, keyed by grouping field value
5. **Grouping Field Preservation**: The grouping field (e.g., `asset_key`) is removed from defaults and kept in each object so client can look up defaults
### Optimization Logic
```javascript
// Example: 200 objects with asset_key: 'enemy_forest_1'
{
'enemy_1': {asset_key: 'enemy_forest_1', type: 'npc', enabled: true, x: 100, y: 200},
'enemy_2': {asset_key: 'enemy_forest_1', type: 'npc', enabled: true, x: 150, y: 250},
...
}
// Filter detects: type, enabled are identical across all 200 objects
// Result:
{
objectsAnimationsData: {
'enemy_1': {asset_key: 'enemy_forest_1', x: 100, y: 200},
'enemy_2': {asset_key: 'enemy_forest_1', x: 150, y: 250},
...
},
animationsDefaults: {
'enemy_forest_1': {type: 'npc', enabled: true, ...}
}
}
```
**Key Points**:
- `asset_key` stays in each object (needed for client to lookup defaults)
- Only properties with IDENTICAL values across ALL objects in group are extracted
- Properties with different values (x, y, content, options, id) stay in each object
- Single-object groups are NOT optimized (no shared properties to extract)
### When Optimization Happens vs Doesn't
**Town Room (6 NPCs)**:
- Each NPC has unique properties (different types, content, options)
- No groups with 2+ identical objects
- Result: `animationsDefaults: {}` (empty), all data stays in objects
- All objects keep their original structure with `key` field as asset reference
**Forest Room (400 NPCs)**:
- 200 enemies of type A, 200 enemies of type B
- Each group has identical shared properties
- Result: `animationsDefaults: {'enemy_forest_1': {...}, 'enemy_forest_2': {...}}`
- Optimized objects have `asset_key` field added by filter for grouping
- Optimized objects contain only unique properties (x, y) + `asset_key` reference
### preloadAssets Filtering
**Process**:
1. Filters only `asset_type === 'spritesheet'` (matches client loader)
2. Groups remaining assets by `asset_type`
3. Detects identical properties across assets with same type
4. Extracts to `preloadAssetsDefaults[asset_type]`
**Typically Kept Fields** (detected dynamically, NOT hardcoded):
- `asset_type` - Grouping field (stays in each asset)
- `asset_key` - Usually unique per asset
- `asset_file` - Usually unique per asset
- `extra_params` - Often identical for same asset_type
**Typically Removed to Defaults** (if identical across assets):
- Database metadata fields if they happen to be identical
**Result**: Minimal optimization for preloadAssets since most fields are unique per asset.
### objectsAnimationsData Optimization
**Process**:
1. Groups objects by `asset_key` field (or `key` field if no `asset_key`)
2. For groups with 2+ objects: Detects identical properties
3. Removes grouping field from identical properties (keeps in each object)
4. Extracts identical properties to `animationsDefaults[grouping_value]`
5. Objects retain only unique properties + grouping field reference
**Grouping Field Priority**:
1. Use `asset_key` if present (already set by server for optimized objects)
2. Fall back to `key` field if no `asset_key` (non-optimized objects)
**Critical**: Grouping field (`asset_key` or `key`) is NEVER extracted to defaults. It must stay in each object so client can look up the correct defaults entry.
---
## Client-Side: AnimationsDefaultsMerger
### Purpose
Merges extracted defaults back into objects after receiving optimized data from server.
### When It Runs
```javascript
// Only runs if roomData has animationsDefaults property
if(sc.hasOwn(roomData, 'animationsDefaults')){
AnimationsDefaultsMerger.mergeDefaults(roomData);
}
```
**Important**: Server adds `animationsDefaults: {}` (even if empty) when filter is active. This triggers the merger to run.
### Merge Logic
```javascript
for(let key of objectKeys){
let objectData = objectsAnimationsData[key];
// Only process objects with asset_key from server (optimized objects)
if(!sc.hasOwn(objectData, 'asset_key')){
continue; // Keep non-optimized objects untouched
}
// Set key to map index for optimized objects
objectData.key = key;
// Lookup and merge defaults
let assetKey = objectData.asset_key;
if(sc.hasOwn(animationsDefaults, assetKey)){
let defaults = animationsDefaults[assetKey];
objectsAnimationsData[key] = Object.assign({}, defaults, objectData);
}
}
```
### Key Behavior
**Optimized Objects** (have `asset_key` from server):
1. `objectData.key` set to map index (e.g., 'enemy_1')
2. Defaults looked up using `asset_key` value
3. Merged: `Object.assign({}, defaults, objectData)` - object properties override defaults
4. Result has all properties needed for rendering
**Non-Optimized Objects** (no `asset_key` from server):
1. Skipped entirely - no modifications
2. `objectData.key` keeps original value (asset reference like 'people_town_1')
3. All original properties preserved as-is
4. Ready for rendering without merge
### Why This Matters
The merger MUST check for `asset_key` presence before modifying objects because:
- **Objects without `asset_key`**: Were NOT optimized by server, have complete data, use `key` field as asset reference
- **Objects with `asset_key`**: Were optimized by server, have partial data, need defaults merged, use `asset_key` as asset reference
If merger modifies non-optimized objects (changes their `key` field), it breaks asset loading and dialog functionality.
---
## Data Flow Examples
### Town Room (No Optimization)
**Server Processing**:
```javascript
// Original data
objectsAnimationsData: {
'ground-collisions444': {
key: 'door_house_1',
type: 'anim',
enabled: true,
x: 400,
y: 310,
...all properties...
},
'house-collisions-over-player535': {
key: 'people_town_1',
type: 'npc',
enabled: true,
content: 'Hello! My name is Alfred...',
x: 240,
y: 368,
...all properties...
}
}
// SceneDataFilter analysis:
// - Group by 'key' field (no asset_key present)
// - Each object has unique 'key' value = single-object groups
// - No optimization performed
// Server output
{
objectsAnimationsData: { ...unchanged... },
animationsDefaults: {} // Empty - triggers merger but no data to merge
}
```
**Client Processing**:
```javascript
// AnimationsDefaultsMerger.mergeDefaults() runs
for(let key of ['ground-collisions444', 'house-collisions-over-player535']){
let objectData = objectsAnimationsData[key];
// Check for asset_key
if(!sc.hasOwn(objectData, 'asset_key')){
continue; // SKIP - no modifications, keep original data
}
}
// Result: All objects unchanged
objectsAnimationsData: {
'ground-collisions444': {key: 'door_house_1', ...},
'house-collisions-over-player535': {key: 'people_town_1', ...}
}
// AnimationEngine uses props.key fallback
// object['ground-collisions444'].key = 'door_house_1' loads asset 'door_house_1'
// object['house-collisions-over-player535'].key = 'people_town_1' NPC dialog works
```
### Forest Room (With Optimization)
**Server Processing**:
```javascript
// Original data: 400 objects, 200 identical enemies per type
objectsAnimationsData: {
'enemy_1': {
asset_key: 'enemy_forest_1', // Already set by server
type: 'npc',
enabled: true,
targetName: 'enemy-pve',
layerName: 'enemies-layer',
x: 100,
y: 200
},
'enemy_2': {
asset_key: 'enemy_forest_1',
type: 'npc',
enabled: true,
targetName: 'enemy-pve',
layerName: 'enemies-layer',
x: 150,
y: 250
},
// ... 198 more with same asset_key
}
// SceneDataFilter analysis:
// - Group by 'asset_key' field
// - 'enemy_forest_1' group has 200 objects
// - Detects identical: type, enabled, targetName, layerName
// - Keeps unique: x, y (different per object)
// - Keeps grouping field: asset_key (needed for lookup)
// Server output
{
objectsAnimationsData: {
'enemy_1': {asset_key: 'enemy_forest_1', x: 100, y: 200},
'enemy_2': {asset_key: 'enemy_forest_1', x: 150, y: 250},
// ... 198 more (only unique props + asset_key)
},
animationsDefaults: {
'enemy_forest_1': {
type: 'npc',
enabled: true,
targetName: 'enemy-pve',
layerName: 'enemies-layer',
// ... all shared properties
}
}
}
```
**Client Processing**:
```javascript
// AnimationsDefaultsMerger.mergeDefaults() runs
for(let key of ['enemy_1', 'enemy_2', ...]){
let objectData = objectsAnimationsData[key];
// {asset_key: 'enemy_forest_1', x: 100, y: 200}
// Check for asset_key
if(!sc.hasOwn(objectData, 'asset_key')){
continue; // NOT executed - asset_key exists
}
// Set key to map index
objectData.key = key; // 'enemy_1'
// Lookup defaults
let assetKey = objectData.asset_key; // 'enemy_forest_1'
let defaults = animationsDefaults['enemy_forest_1'];
// Merge
objectsAnimationsData[key] = Object.assign({}, defaults, objectData);
// Result: {
// type: 'npc',
// enabled: true,
// targetName: 'enemy-pve',
// layerName: 'enemies-layer',
// asset_key: 'enemy_forest_1',
// key: 'enemy_1',
// x: 100,
// y: 200
// }
}
// AnimationEngine uses props.asset_key (exists) loads asset 'enemy_forest_1'
// All properties restored from defaults + unique props
```
---
## Performance Impact
### 400 Objects Example (Forest Room)
**Unfiltered**:
- preloadAssets: 400 × 2 assets × 275 bytes = 220 KB
- objectsAnimationsData: 400 × 150 bytes = 60 KB
- roomData: 10 KB
- **Total sceneData**: ~290 KB
- **Total State (with 50 players)**: ~176 KB encoded
- **Buffer overflow**: Required 176 KB vs 8 KB default
**Optimized**:
- preloadAssets: 2 spritesheets × 95 bytes = 0.2 KB
- objectsAnimationsData: 400 × 35 bytes = 14 KB
- animationsDefaults: 2 entries × 140 bytes = 0.3 KB
- roomData: 10 KB
- **Total sceneData**: ~25 KB
- **Total State (with 50 players)**: ~80 KB encoded
**Reduction**:
- sceneData: 265 KB saved (91% reduction)
- Total State: 96 KB saved (54.5% reduction)
---
## Configuration
### sendAll Flag
**Path**: `server/rooms/data/sendAll`
**Default**: `false` (filtering enabled)
```sql
INSERT INTO config (path, value, scope) VALUES
('server/rooms/data/sendAll', 'false', 'server');
```
**Values**:
- `false`: Enables optimization (recommended for production)
- `true`: Sends all data unfiltered (debugging only)
### Custom Processor
For custom filtering logic, define a processor in server plugin.
**Path**: `server/customClasses/sceneDataProcessor`
**Method**: `process({ roomData, filter })`
**Example**:
```javascript
class CustomSceneDataProcessor {
process({ roomData, filter }) {
let customData = Object.assign({}, roomData);
// Use filter methods for standard optimization
let optimized = filter.buildFilteredData(roomData);
// Add custom fields
customData.customField = 'custom value';
return Object.assign({}, optimized, customData);
}
}
config.set('server/customClasses/sceneDataProcessor', new CustomSceneDataProcessor());
```
---
## Key Concepts
### asset_key Field
**Purpose**: Reference to shared defaults, used for grouping and lookup
**When Present**:
- Server added it during optimization (object was grouped with others)
- Indicates object has partial data, needs defaults merged
- Client uses it to lookup defaults and as asset reference
**When NOT Present**:
- Object was not optimized (unique properties, single-object group)
- Object has complete data, no merge needed
- Client uses `key` field as asset reference
### key Field
**Two Different Roles**:
1. **Non-Optimized Objects**: Asset reference (e.g., 'people_town_1')
- Original value from server
- AnimationEngine fallback: `sc.get(props, 'asset_key', props.key)`
- Used to load sprite asset
2. **Optimized Objects**: Map index (e.g., 'enemy_1')
- Set by client merger to map key
- Not used for asset loading (asset_key used instead)
- Identifies object instance
### Grouping Fields
**Purpose**: Field used to group objects for comparison and defaults lookup
**Requirements**:
- Must be identical across all objects in group
- Must stay in each object (NOT extracted to defaults)
- Client needs it to look up correct defaults entry
**Examples**:
- `asset_type` for preloadAssets
- `asset_key` for objectsAnimationsData (if present)
- `key` for objectsAnimationsData (fallback if no asset_key)
### Why Grouping Field Must Stay in Objects
```javascript
// If asset_key was extracted to defaults:
objectsAnimationsData: {
'enemy_1': {x: 100, y: 200} // No asset_key!
}
animationsDefaults: {
'enemy_forest_1': {asset_key: 'enemy_forest_1', type: 'npc', ...}
}
// Client can't merge - doesn't know which defaults to use!
// No way to know 'enemy_1' should use 'enemy_forest_1' defaults
```
Keeping grouping field in each object allows lookup:
```javascript
let assetKey = objectData.asset_key; // 'enemy_forest_1'
let defaults = animationsDefaults[assetKey]; // Found!
```
---
## Integration Points
### Server Integration
**RoomScene** (`lib/rooms/server/scene.js`):
```javascript
this.sceneDataFilter = new SceneDataFilter({configManager: this.configManager});
```
**State** (`lib/rooms/server/state.js`):
```javascript
constructor(data){
this.sceneDataFilter = sc.get(data, 'sceneDataFilter', false);
}
mapRoomData(roomData){
if(false === this.sceneDataFilter){
return roomData;
}
return this.sceneDataFilter.filterRoomData(roomData);
}
```
### Client Integration
**RoomEvents** (`lib/game/client/room-events.js`):
```javascript
this.room.onMessage('*', (message) => {
if('sceneData' === message.act){
let roomData = message.scene;
// Merge defaults if present
if(sc.hasOwn(roomData, 'animationsDefaults')){
AnimationsDefaultsMerger.mergeDefaults(roomData);
}
// Process room data...
}
});
```
**AnimationEngine** (`lib/game/client/animation-engine.js`):
```javascript
constructor(props){
// Uses asset_key if present, falls back to key
this.asset_key = sc.get(props, 'asset_key', props.key);
}
```
---
## Testing
### Verify Optimization Behavior
**Town Room (No Optimization Expected)**:
1. Join Town room
2. Check browser console: No `asset_key` in objects
3. Verify: `animationsDefaults: {}`
4. Test NPC dialogs work correctly
**Forest Room (Optimization Expected)**:
1. Join Forest room with 400 objects
2. Check browser console: Objects have `asset_key` field
3. Verify: `animationsDefaults` has entries
4. Test enemies render and behave correctly
### Measure Data Size
Add logging in `State.mapRoomData()`:
```javascript
this.sceneData = JSON.stringify(roomData);
Logger.info('sceneData size: ' + this.sceneData.length + ' bytes');
```
### Verify Buffer Overflow Resolved
```bash
npm run bots -- --room=reldens-bots-forest --bots=50
```
Expected: No buffer overflow warnings in server console.
### Verify Client Functionality
1. Join rooms with various object counts
2. Verify spritesheets load correctly
3. Verify animations play correctly
4. Verify NPC dialogs work correctly
5. Check browser console for errors related to missing assets or properties
---
## Debugging
### Disable Filtering
Set in database or config:
```javascript
config.set('server/rooms/data/sendAll', true);
```
Sends all database fields to client for debugging. Compare filtered vs unfiltered data to identify issues.
### Log Optimization Results
```javascript
class DebugSceneDataProcessor {
process({ roomData, filter }) {
let filtered = filter.buildFilteredData(roomData);
Logger.info('objectsAnimationsData count:', Object.keys(filtered.objectsAnimationsData || {}).length);
Logger.info('animationsDefaults entries:', Object.keys(filtered.animationsDefaults || {}).length);
// Log which objects were optimized
for(let key in filtered.objectsAnimationsData){
let obj = filtered.objectsAnimationsData[key];
if(sc.hasOwn(obj, 'asset_key')){
Logger.info('Optimized object:', key, 'asset_key:', obj.asset_key);
}
}
return filtered;
}
}
```
### Common Issues
**NPCs Not Visible**:
- Check browser console for asset loading errors
- Verify `asset_key` or `key` field present in object
- Verify asset exists in preloadAssets
- Check AnimationEngine.asset_key is set correctly
**NPC Dialogs Not Working**:
- Verify non-optimized objects keep original `key` field value
- Check AnimationsDefaultsMerger is NOT modifying objects without `asset_key`
- Verify dialog system uses correct object reference
**Buffer Overflow Still Occurring**:
- Verify `sendAll: false` in config
- Check optimization is detecting shared properties
- Log data size before/after filtering
- Verify client is merging defaults correctly
---
## References
- **Server Filter**: `lib/rooms/server/scene-data-filter.js`
- **Client Merger**: `lib/game/client/animations-defaults-merger.js`
- **State Integration**: `lib/rooms/server/state.js`
- **Scene Integration**: `lib/rooms/server/scene.js`
- **Room Events**: `lib/game/client/room-events.js`
- **Animation Engine**: `lib/game/client/animation-engine.js`
- **Colyseus Schema**: https://docs.colyseus.io/state/schema/
================================================
FILE: .claude/room-images-tileset-override-flow.md
================================================
# Room Images and Tileset Override System
## Overview
This document explains how the room scene images upload system works and how the `overrideSceneImagesWithMapFile` option automatically synchronizes scene images with the Tiled map file tilesets.
## Configuration
**Config Path:** `server/rooms/maps/overrideSceneImagesWithMapFile`
**Type:** Boolean
**Default:** `true`
**Location:** Database `config` table or environment variable
When enabled, the system uses the Tiled map file as the source of truth for scene images, automatically overriding the `scene_images` field with images listed in the map's tilesets.
## File Locations
### Source Code
- **Validator:** `lib/admin/server/room-map-tilesets-validator.js`
- **Subscriber:** `lib/admin/server/subscribers/rooms-entity-subscriber.js`
- **File Upload Renderer:** `lib/admin/server/rooms-file-upload-renderer.js`
- **Admin Plugin:** `lib/admin/server/plugin.js`
### Admin Interface
- **Tileset File Item Template:** `theme/admin/templates/fields/edit/tileset-file-item.html`
- **Tileset Alert Wrapper Template:** `theme/admin/templates/fields/edit/tileset-alert-wrapper.html`
- **Client JS:** `theme/admin/reldens-admin-client.js`
- **Client CSS:** `theme/admin/reldens-admin-client.css`
- **Router:** `npm-packages/reldens-cms/lib/admin-manager/router-contents.js`
## Database Schema
### Rooms Table
- `id` - Room identifier
- `map_filename` - Tiled map JSON file (e.g., `reldens-forest.json`)
- `scene_images` - Comma-separated list of tileset images (e.g., `reldens-forest.png,reldens-town.png`)
### Upload Configuration
Both fields are configured as upload fields:
- `map_filename` - Single file upload, bucket: `theme/assets/maps`
- `scene_images` - Multiple file upload, bucket: `theme/assets/images`
## System Flow
### 1. Initial Room Creation
**User Actions:**
1. Navigate to Admin → Rooms → Create New
2. Upload map JSON file to `map_filename` field
3. Upload tileset images to `scene_images` field
4. Click Save
**System Processing:**
1. **Upload Phase** - Files saved to respective buckets
2. **Validation Phase** - `validateUploadedFiles()` checks required fields
3. **Save Phase** - Entity created in database
4. **Post-Save Event** - `reldens.adminAfterEntitySave` fires
5. **Validator Execution** - `RoomMapTilesetsValidator.validate()` runs
**Validator Logic:**
```javascript
// Check if override is enabled
overrideEnabled = config.getWithoutLogs('server/rooms/maps/overrideSceneImagesWithMapFile', true)
// Read map file
mapData = readMapFile(bucket, mapFilename, roomId)
// Extract tileset images from map JSON
tilesetImages = extractTilesetImages(mapData.tilesets)
// Example: ['reldens-forest.png']
// Compare with current scene_images
if (tilesetImages !== currentSceneImages) {
// Validate all images exist in scene_images bucket
if (validateImagesExist(tilesetImages, sceneImagesBucket)) {
// Override scene_images with tileset images
roomsRepository.updateById(roomId, {scene_images: tilesetImages.join(',')})
}
}
```
### 2. Room Editing
**User Actions:**
1. Navigate to Admin → Rooms → Edit Room
2. View existing files in both fields
3. Modify files or click Save without changes
**Edit Form Population:**
**Event:** `reldens.adminEditPropertiesPopulation`
**Flow:**
```javascript
// 1. Event emitted with room data
event = {
driverResource, // Entity configuration
renderedEditProperties, // Form properties
loadedEntity, // Room from database
entityId: 'rooms',
entityData: loadedEntity
}
// 2. RoomsEntitySubscriber.populateEditFormTilesetImages() executes
if (overrideSceneImagesWithMapFile) {
// Extract tileset images from map file
tilesetImages = validator.extractTilesetImagesFromEntity(entityData, driverResource)
// Inject into form properties
renderedEditProperties.tilesetImages = tilesetImages
renderedEditProperties.overrideSceneImagesEnabled = true
}
// 3. RoomsFileUploadRenderer processes scene_images field
// Event: reldens.adminBeforeFieldRender
if (propertyKey === 'scene_images' && tilesetImages.length > 0) {
// Render each file with protection flag
for each file:
renderedFileItems.push(render tileset-file-item.html with {
filename,
isProtected: tilesetImages.includes(filename)
})
// Wrap files in alert container
templateData.renderedFiles = render tileset-alert-wrapper.html
}
// 4. Template renders with tileset protection
{{^isProtected}}
<button class="remove-upload-btn">X</button> -
{{/isProtected}}
{{filename}}
```
**Result:**
- Protected images (tilesets): NO remove button
- Non-protected images: Remove button shown
- Alert icon displays with info message
### 3. Saving Changes
**Scenario A: No Files Changed**
1. User clicks Save without uploading/removing files
2. Validation passes (existing files satisfy requirement)
3. Entity updated with form data
4. Post-save validator runs
5. If scene_images matches tilesets → No action
6. If mismatch → Override with tileset images
**Scenario B: Add New Image**
1. User uploads additional image to `scene_images`
2. `prepareUploadPatchData()` appends new file to existing files
3. Entity saved with: `existing_images.png,new_image.png`
4. Post-save validator runs
5. Validates tileset images exist
6. **Overrides** scene_images with ONLY tileset images (removes non-tileset images)
**Scenario C: Remove Non-Protected Image**
1. User clicks X button on non-protected image
2. Client adds filename to `removed_scene_images` hidden input
3. `prepareUploadPatchData()` filters removed files
4. Entity saved with filtered list
5. Post-save validator runs
6. Overrides with tileset images (removes non-tileset files)
**Scenario D: Attempt Remove Protected Image (Prevented)**
1. Protected image (tileset) has NO remove button
2. User cannot remove it through UI
3. Alert icon displays: "Images specified in the tileset can't be removed since the option overrideSceneImagesWithMapFile is active."
### 4. Map File Update
**User Updates Map File:**
1. User replaces `map_filename` with new Tiled map
2. New map references different tileset images
3. Entity saved
4. Post-save validator executes
5. Reads new map file tilesets
6. **Replaces** scene_images with new tileset images
7. Old images no longer referenced (user must manage cleanup)
## Technical Details
### Map File Structure
**Example: reldens-forest.json**
```json
{
"tilesets": [
{
"columns": 14,
"firstgid": 1,
"image": "reldens-forest.png",
"imageheight": 408,
"imagewidth": 476,
"name": "reldens-forest",
"tilecount": 168
}
]
}
```
**Extraction Logic:**
```javascript
extractTilesetImages(mapData) {
let tilesets = mapData.tilesets || []
let images = []
for (let tileset of tilesets) {
let tilesetImage = tileset.image // 'reldens-forest.png' or '../images/reldens-forest.png'
let imageFileName = tilesetImage.split('/').pop() // Extract filename only
if (!images.includes(imageFileName)) {
images.push(imageFileName)
}
}
return images // ['reldens-forest.png']
}
```
### Validation Logic
**Array Comparison (validator):**
```javascript
arraysAreEqual(array1, array2) {
if (array1.length !== array2.length) {
return false
}
let sorted1 = [...array1].sort()
let sorted2 = [...array2].sort()
for (let i = 0; i < sorted1.length; i++) {
if (sorted1[i] !== sorted2[i]) {
return false
}
}
return true
}
```
**Image Existence Validation (validator):**
```javascript
validateImagesExist(tilesetImages, sceneImagesBucket, roomId, mapFilename) {
for (let imageFileName of tilesetImages) {
let imageFilePath = FileHandler.joinPaths(sceneImagesBucket, imageFileName)
if (!FileHandler.exists(imageFilePath)) {
return false
}
}
return true
}
```
### Client-Side Protection
**File Item Template (tileset-file-item.html):**
```html
<p class="upload-current-file" data-field="{{&fieldName}}" data-filename="{{&filename}}">
{{^isProtected}}
<button type="button" class="remove-upload-btn" data-field="{{&fieldName}}" data-filename="{{&filename}}" title="REMOVE">X</button> -
{{/isProtected}}
{{&filename}}
</p>
```
**Alert Wrapper Template (tileset-alert-wrapper.html):**
```html
<div class="tileset-alert-wrapper">
<div class="upload-files-with-alert">
{{{renderedFileItems}}}
</div>
<div class="tileset-alert-icon-container">
<img src="/assets/admin/alert.png" class="tileset-alert-icon" alt="Info" title="Images specified in the tileset can't be removed since the option overrideSceneImagesWithMapFile is active.">
<span class="tileset-info-message hidden">Images specified in the tileset can't be removed since the option overrideSceneImagesWithMapFile is active.</span>
</div>
</div>
```
**JavaScript Toggle (reldens-admin-client.js):**
```javascript
document.querySelectorAll('.tileset-alert-icon').forEach(icon => {
icon.addEventListener('click', () => {
let message = icon.nextElementSibling
if (message?.classList.contains('tileset-info-message')) {
message.classList.toggle('hidden')
}
})
})
```
## Benefits
1. **Consistency:** Scene images always match map tilesets
2. **Automation:** No manual sync between map and images
3. **Single Source of Truth:** Tiled map file controls image references
4. **Developer Experience:** Edit maps in Tiled, changes auto-sync
## Limitations
1. **One-Way Sync:** Map → Database only (not bidirectional)
2. **Cleanup Required:** Removing tileset from map doesn't delete old image files
3. **Override Always Wins:** Manual changes to scene_images get overwritten on next save
4. **Requires Config:** Must enable `overrideSceneImagesWithMapFile` to activate
## Disabling the Feature
To disable tileset override and manage images manually:
**Option 1: Database Config**
```sql
UPDATE config
SET value = '0'
WHERE path = 'server/rooms/maps/overrideSceneImagesWithMapFile';
```
**Option 2: Environment Variable**
```bash
RELDENS_SERVER_ROOMS_MAPS_OVERRIDESCENEIMAGESWITHMAPFILE=0
```
**Result:**
- Post-save validation skipped
- All images show remove buttons
- Full manual control over scene_images field
- Map file and scene_images can diverge
================================================
FILE: .claude/stat-bars-configuration.md
================================================
# Stat Bars Configuration
## Overview
The player stats bars system is a generic client-side feature that displays visual bars for any configured player stat in the player box UI.
## Configuration Path
**Scope**: `client`
**Path**: `players/barsProperties`
**Type**: JSON (type 4)
## Configuration Structure
The configuration is a JSON object where each key represents a stat key, and each value contains the bar properties for that stat.
```json
{
"statKey": {
"enabled": true,
"label": "Display Label",
"activeColor": "#hexcolor",
"inactiveColor": "#hexcolor"
}
}
```
## Properties
Each stat bar configuration requires the following properties:
- **enabled** (boolean): Whether the bar should be displayed
- **label** (string): The display label shown above the bar
- **activeColor** (string): Hex color for the filled portion of the bar
- **inactiveColor** (string): Hex color for the empty/background portion of the bar
All four properties are required. If any property is missing, the bar will not be displayed.
## Activation Rules
- If config does not exist or is empty: bars system is NOT activated
- If config exists: bars are activated ONLY for stats with all required properties
- Each stat is validated independently via BarProperties model
- Only bars with `ready === true` are rendered
## Database Configuration
### Development Migration
Add to `migrations/development/beta.39.7-sql-update.sql`:
```sql
INSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES
('client', 'players/barsProperties', '{"hp":{"enabled":true,"label":"HP","activeColor":"#ff0000","inactiveColor":"#330000"},"mp":{"enabled":true,"label":"MP","activeColor":"#0000ff","inactiveColor":"#000033"}}', 4);
```
### Production Migration
Add to `migrations/production/reldens-basic-config-v4.0.0.sql`:
```sql
(92, 'client', 'players/barsProperties', '{"hp":{"enabled":true,"label":"HP","activeColor":"#ff0000","inactiveColor":"#330000"},"mp":{"enabled":true,"label":"MP","activeColor":"#0000ff","inactiveColor":"#000033"}}', 4),
```
## Examples
### HP and MP Bars
```json
{
"hp": {
"enabled": true,
"label": "HP",
"activeColor": "#ff0000",
"inactiveColor": "#330000"
},
"mp": {
"enabled": true,
"label": "MP",
"activeColor": "#0000ff",
"inactiveColor": "#000033"
}
}
```
### Stamina Bar
```json
{
"stamina": {
"enabled": true,
"label": "Stamina",
"activeColor": "#00ff00",
"inactiveColor": "#003300"
}
}
```
### Multiple Stats
```json
{
"hp": {
"enabled": true,
"label": "HP",
"activeColor": "#ff0000",
"inactiveColor": "#330000"
},
"mp": {
"enabled": true,
"label": "MP",
"activeColor": "#0000ff",
"inactiveColor": "#000033"
},
"stamina": {
"enabled": true,
"label": "STA",
"activeColor": "#ffff00",
"inactiveColor": "#333300"
},
"atk": {
"enabled": false,
"label": "ATK",
"activeColor": "#ff6600",
"inactiveColor": "#331100"
}
}
```
In this example, HP, MP, and Stamina bars will be displayed. ATK bar will not be displayed because `enabled: false`.
## Disabling Bars
To disable a specific stat bar, set `enabled: false`:
```json
{
"hp": {
"enabled": false,
"label": "HP",
"activeColor": "#ff0000",
"inactiveColor": "#330000"
}
}
```
To disable the entire bars system, remove the config or set it to an empty object `{}`.
## Technical Notes
- The stat key in the config must match the stat key in the database `stats` table
- Bars are rendered in the order they appear in the configuration object
- Bar values are calculated from `message.stats[statKey]` (current) and `message.statsBase[statKey]` (max)
- Percentage calculation: `(currentValue / maxValue) * 100`
- Bars update automatically when stats change via `reldens.playerStatsUpdateAfter` event
- Bars are rendered inside `#player-stats-bars-wrapper` within `#ui-player-extras` container
---
# Player Names Configuration
## Overview
The player names system displays character names above sprites. Names can be configured separately for the current player and other players.
## Configuration Path
**Scope**: `client`
**Path**: `ui/players`
**Type**: Multiple (boolean, object)
## Configuration Properties
### Visibility Controls
- **showCurrentPlayerName** (type 3 - boolean): Show name for the current player
- Default: `0` (hidden)
- Database: `client/ui/players/showCurrentPlayerName`
- When disabled, current player's name will not be displayed
- Useful when using alternative UI systems or cleaner visual experience
- **showNames** (type 3 - boolean): Show names for all other players
- Default: `1` (enabled)
- Database: `client/ui/players/showNames`
- Controls name visibility for other players (not current player)
- **showNamesLimit** (type 2 - number): Maximum name length before truncation
- Default: `10`
- Database: `client/ui/players/showNamesLimit`
- Names longer than this value will be truncated with '...'
### Visual Appearance
Names are styled using the `nameText` configuration object with the following properties:
- **align** (type 1 - string): Text alignment
- Default: `center`
- Database: `client/ui/players/nameText/align`
- **depth** (type 2 - number): Rendering depth/z-index
- Default: `200000`
- Database: `client/ui/players/nameText/depth`
- **fill** (type 1 - string): Text color
- Default: `#ffffff`
- Database: `client/ui/players/nameText/fill`
- **fontFamily** (type 1 - string): Font family
- Default: `Verdana, Geneva, sans-serif`
- Database: `client/ui/players/nameText/fontFamily`
- **fontSize** (type 1 - string): Font size
- Default: `12px`
- Database: `client/ui/players/nameText/fontSize`
- **height** (type 2 - number): Vertical offset from sprite
- Default: `-90`
- Database: `client/ui/players/nameText/height`
- **shadowBlur** (type 2 - number): Shadow blur radius
- Default: `5`
- Database: `client/ui/players/nameText/shadowBlur`
- **shadowColor** (type 1 - string): Shadow color
- Default: `rgba(0,0,0,0.7)`
- Database: `client/ui/players/nameText/shadowColor`
- **shadowX** (type 2 - number): Shadow X offset
- Default: `5`
- Database: `client/ui/players/nameText/shadowX`
- **shadowY** (type 2 - number): Shadow Y offset
- Default: `5`
- Database: `client/ui/players/nameText/shadowY`
- **stroke** (type 1 - string): Text stroke color
- Default: `#000000`
- Database: `client/ui/players/nameText/stroke`
- **strokeThickness** (type 2 - number): Stroke thickness
- Default: `4`
- Database: `client/ui/players/nameText/strokeThickness`
## Database Configuration
### Development Migration
Add to `migrations/development/[version]-sql-update.sql`:
```sql
INSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES
('client', 'ui/players/showCurrentPlayerName', '0', 3);
```
### Production Migration
From `migrations/production/reldens-basic-config-v4.0.0.sql`:
Existing configurations (IDs 239-252):
```sql
(239, 'client', 'ui/players/nameText/align', 'center', 1),
(240, 'client', 'ui/players/nameText/depth', '200000', 2),
(241, 'client', 'ui/players/nameText/fill', '#ffffff', 1),
(242, 'client', 'ui/players/nameText/fontFamily', 'Verdana, Geneva, sans-serif', 1),
(243, 'client', 'ui/players/nameText/fontSize', '12px', 1),
(244, 'client', 'ui/players/nameText/height', '-90', 2),
(245, 'client', 'ui/players/nameText/shadowBlur', '5', 2),
(246, 'client', 'ui/players/nameText/shadowColor', 'rgba(0,0,0,0.7)', 1),
(247, 'client', 'ui/players/nameText/shadowX', '5', 2),
(248, 'client', 'ui/players/nameText/shadowY', '5', 2),
(249, 'client', 'ui/players/nameText/stroke', '#000000', 1),
(250, 'client', 'ui/players/nameText/strokeThickness', '4', 2),
(251, 'client', 'ui/players/nameText/textLength', '4', 2),
(252, 'client', 'ui/players/showNames', '1', 3),
```
New configuration to add:
```sql
(253, 'client', 'ui/players/showCurrentPlayerName', '0', 3),
```
## Configuration Examples
### Example 1: Hide Current Player Name
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';
```
Current player's name will not be displayed. Useful when using alternative UI systems.
### Example 2: Hide All Other Players' Names
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';
```
Other players' names will not be displayed. Current player's name visibility depends on `showCurrentPlayerName`.
### Example 3: Show Both Current Player and Other Players' Names
```sql
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';
```
All players' names will be displayed.
### Example 4: Customize Name Text Style
```sql
UPDATE `config` SET `value` = '#00ff00' WHERE `scope` = 'client' AND `path` = 'ui/players/nameText/fill';
UPDATE `config` SET `value` = '16px' WHERE `scope` = 'client' AND `path` = 'ui/players/nameText/fontSize';
UPDATE `config` SET `value` = '6' WHERE `scope` = 'client' AND `path` = 'ui/players/nameText/strokeThickness';
```
Creates green player names with 16px font size and thicker stroke.
## Visibility Behavior
**Configuration: showCurrentPlayerName=0, showNames=0**
- Current Player: Name hidden
- Other Players: Names hidden
**Configuration: showCurrentPlayerName=0, showNames=1**
- Current Player: Name hidden
- Other Players: Names shown
**Configuration: showCurrentPlayerName=1, showNames=0**
- Current Player: Name shown
- Other Players: Names hidden
**Configuration: showCurrentPlayerName=1, showNames=1**
- Current Player: Name shown
- Other Players: Names shown
## Implementation Details
### Files
- **PlayerEngine**: `lib/users/client/player-engine.js` - Main player management class
- **SpriteTextFactory**: `lib/game/client/engine/sprite-text-factory.js` - Text rendering utility
### Key Methods
- `showPlayerName(id)`: Displays name above player sprite, checks configuration
- `updateNamePosition(playerSprite)`: Updates name position during movement
- `applyNameLengthLimit(showName)`: Truncates long names
### Events
- `reldens.playerEngineAddPlayer`: Called when player is added, triggers name display
- `reldens.runPlayerAnimation`: Updates name position during animation
---
# Life Bar Configuration
## Overview
The life bar system displays health bars for the current player, other players, NPCs, and enemies. Life bars are rendered using Phaser graphics and can be positioned either fixed on the UI scene or floating above sprites.
## Configuration Path
**Scope**: `client`
**Path**: `ui/lifeBar`
**Type**: Multiple (boolean, number, string)
## Configuration Properties
### Core Settings
- **enabled** (type 3 - boolean): Enable or disable the entire lifebar system
- Default: `1` (enabled)
- Database: `client/ui/lifeBar/enabled`
### Visual Appearance
- **fillStyle** (type 1 - string): Hex color for the filled portion of the bar
- Default: `0xff0000` (red)
- Database: `client/ui/lifeBar/fillStyle`
- Format: Hex color without `#` prefix (e.g., `0xff0000`)
- **lineStyle** (type 1 - string): Hex color for the bar border
- Default: `0xffffff` (white)
- Database: `client/ui/lifeBar/lineStyle`
- Format: Hex color without `#` prefix (e.g., `0xffffff`)
- **height** (type 2 - number): Height of the bar in pixels
- Default: `5`
- Database: `client/ui/lifeBar/height`
- **width** (type 2 - number): Width of the bar in pixels
- Default: `50`
- Database: `client/ui/lifeBar/width`
- **top** (type 2 - number): Distance above sprite in pixels
- Default: `5`
- Database: `client/ui/lifeBar/top`
### Positioning
The lifebar system supports two positioning modes: fixed and floating.
#### Fixed Position
- **fixedPosition** (type 3 - boolean): Current player's bar appears at fixed position on UI scene
- Default: `0` (floating above sprite)
- Database: `client/ui/lifeBar/fixedPosition`
- When enabled, uses `x`, `y`, `responsiveX`, `responsiveY` properties
- **x** (type 2 - number): Fixed X position in pixels
- Default: `5`
- Database: `client/ui/lifeBar/x`
- Used when `fixedPosition: 1` and responsive mode is disabled
- **y** (type 2 - number): Fixed Y position in pixels
- Default: `12`
- Database: `client/ui/lifeBar/y`
- Used when `fixedPosition: 1` and responsive mode is disabled
#### Responsive Positioning
- **responsiveX** (type 2 - number): Responsive X position as percentage of screen width
- Default: `1`
- Database: `client/ui/lifeBar/responsiveX`
- Calculation: `uiX = responsiveX * screenWidth / 100`
- Used when `fixedPosition: 1` and `client/ui/screen/responsive` is enabled
- **responsiveY** (type 2 - number): Responsive Y position as percentage of screen height
- Default: `24`
- Database: `client/ui/lifeBar/responsiveY`
- Calculation: `uiY = responsiveY * screenHeight / 100`
- Used when `fixedPosition: 1` and `client/ui/screen/responsive` is enabled
### Visibility Controls
- **showCurrentPlayer** (type 3 - boolean): Show lifebar for the current player
- Default: `0` (hidden)
- Database: `client/ui/lifeBar/showCurrentPlayer`
- When disabled, current player's lifebar will not be displayed
- Useful when using alternative UI systems like player stats bars
- **showAllPlayers** (type 3 - boolean): Show lifebars for all other players
- Default: `0` (hidden)
- Database: `client/ui/lifeBar/showAllPlayers`
- When disabled, other players' bars only show via `showOnClick`
- **showEnemies** (type 3 - boolean): Show lifebars for NPCs and enemies
- Default: `1` (enabled)
- Database: `client/ui/lifeBar/showEnemies`
- Controls all objects (NPCs/enemies)
- **showOnClick** (type 3 - boolean): Show lifebars only when target is clicked
- Default: `1` (enabled)
- Database: `client/ui/lifeBar/showOnClick`
- Works for both other players and objects when their specific show flags are disabled
## Database Configuration
### Development Migration
Add to `migrations/development/[version]-sql-update.sql`:
```sql
INSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES
('client', 'ui/lifeBar/enabled', '1', 3),
('client', 'ui/lifeBar/fillStyle', '0xff0000', 1),
('client', 'ui/lifeBar/fixedPosition', '0', 3),
('client', 'ui/lifeBar/height', '5', 2),
('client', 'ui/lifeBar/lineStyle', '0xffffff', 1),
('client', 'ui/lifeBar/responsiveX', '1', 2),
('client', 'ui/lifeBar/responsiveY', '24', 2),
('client', 'ui/lifeBar/showAllPlayers', '0', 3),
('client', 'ui/lifeBar/showCurrentPlayer', '0', 3),
('client', 'ui/lifeBar/showEnemies', '1', 3),
('client', 'ui/lifeBar/showOnClick', '1', 3),
('client', 'ui/lifeBar/top', '5', 2),
('client', 'ui/lifeBar/width', '50', 2),
('client', 'ui/lifeBar/x', '5', 2),
('client', 'ui/lifeBar/y', '12', 2);
```
### Production Migration
From `migrations/production/reldens-basic-config-v4.0.0.sql` (IDs 181-194):
```sql
(181, 'client', 'ui/lifeBar/enabled', '1', 3),
(182, 'client', 'ui/lifeBar/fillStyle', '0xff0000', 1),
(183, 'client', 'ui/lifeBar/fixedPosition', '0', 3),
(184, 'client', 'ui/lifeBar/height', '5', 2),
(185, 'client', 'ui/lifeBar/lineStyle', '0xffffff', 1),
(186, 'client', 'ui/lifeBar/responsiveX', '1', 2),
(187, 'client', 'ui/lifeBar/responsiveY', '24', 2),
(188, 'client', 'ui/lifeBar/showAllPlayers', '0', 3),
(189, 'client', 'ui/lifeBar/showCurrentPlayer', '0', 3),
(190, 'client', 'ui/lifeBar/showEnemies', '1', 3),
(191, 'client', 'ui/lifeBar/showOnClick', '1', 3),
(192, 'client', 'ui/lifeBar/top', '5', 2),
(193, 'client', 'ui/lifeBar/width', '50', 2),
(194, 'client', 'ui/lifeBar/x', '5', 2),
(195, 'client', 'ui/lifeBar/y', '12', 2),
```
## Configuration Examples
### Example 1: Fixed Position in Top-Left Corner
```sql
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/fixedPosition';
UPDATE `config` SET `value` = '5' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/x';
UPDATE `config` SET `value` = '5' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/y';
```
This positions the current player's lifebar at coordinates (5, 5) on the UI scene, fixed regardless of player movement.
### Example 2: Responsive Fixed Position
```sql
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/fixedPosition';
UPDATE `config` SET `value` = '50' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/responsiveX';
UPDATE `config` SET `value` = '5' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/responsiveY';
```
This positions the current player's lifebar at 50% of screen width and 5% of screen height, adapting to different resolutions.
### Example 3: Show All Players' Lifebars
```sql
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';
```
All other players' lifebars are always visible, floating above their sprites.
### Example 4: Hide Enemy Lifebars
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showEnemies';
```
NPCs and enemies will not show lifebars at all.
### Example 5: Hide Current Player Lifebar
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showCurrentPlayer';
```
Current player's lifebar will not be displayed. Useful when using alternative UI systems like player stats bars.
### Example 6: Always Show Bars (No Click Required)
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showOnClick';
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showEnemies';
```
All players and enemies will always show their lifebars without requiring click interaction.
### Example 7: Custom Colors and Dimensions
```sql
UPDATE `config` SET `value` = '0x00ff00' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/fillStyle';
UPDATE `config` SET `value` = '0x000000' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/lineStyle';
UPDATE `config` SET `value` = '80' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/width';
UPDATE `config` SET `value` = '8' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/height';
```
Creates a green lifebar with black border, 80 pixels wide and 8 pixels tall.
## Visibility Behavior
The current player's lifebar visibility is controlled by `showCurrentPlayer` configuration.
**Configuration: showCurrentPlayer=0, showAllPlayers=0, showEnemies=0, showOnClick=0**
- Current Player: Never
- Other Players: Never
- NPCs/Enemies: Never
**Configuration: showCurrentPlayer=0, showAllPlayers=0, showEnemies=0, showOnClick=1**
- Current Player: Never
- Other Players: On Click
- NPCs/Enemies: Never
**Configuration: showCurrentPlayer=0, showAllPlayers=0, showEnemies=1, showOnClick=1**
- Current Player: Never
- Other Players: On Click
- NPCs/Enemies: On Click
**Configuration: showCurrentPlayer=1, showAllPlayers=0, showEnemies=0, showOnClick=0**
- Current Player: Always
- Other Players: Never
- NPCs/Enemies: Never
**Configuration: showCurrentPlayer=1, showAllPlayers=0, showEnemies=1, showOnClick=1**
- Current Player: Always
- Other Players: On Click
- NPCs/Enemies: On Click
**Configuration: showCurrentPlayer=1, showAllPlayers=1, showEnemies=0, showOnClick=0**
- Current Player: Always
- Other Players: Always
- NPCs/Enemies: Never
**Configuration: showCurrentPlayer=1, showAllPlayers=1, showEnemies=1, showOnClick=0**
- Current Player: Always
- Other Players: Always
- NPCs/Enemies: Always
## Positioning Behavior
### Floating Mode (fixedPosition: 0)
- Current player's bar floats above sprite
- Other players' bars float above their sprites
- NPCs/enemies bars float above their sprites
- Bars automatically update position as sprites move
- Position calculation: `(spriteX - barWidth/2, spriteY - barHeight - top + spriteTopOffset/2)`
### Fixed Mode (fixedPosition: 1)
- **Current player only**: Bar appears at fixed position on UI scene
- Other players and NPCs/enemies always float above sprites
- Fixed position uses either:
- Absolute coordinates: `x`, `y` properties (when responsive is disabled)
- Responsive coordinates: `responsiveX`, `responsiveY` properties (when `client/ui/screen/responsive` is enabled)
- Bar position updates on screen resize
## Implementation Details
### Files
- **LifebarUi**: `lib/users/client/lifebar-ui.js` - Main lifebar management class
- **ObjectsHandler**: `lib/users/client/objects-handler.js` - Handles NPCs/enemies lifebars
- **Plugin**: `lib/users/client/plugin.js` - Initializes lifebar system
### Events
- `reldens.playerStatsUpdateAfter`: Updates current player's lifebar
- `reldens.joinedRoom`: Sets up message listeners for lifebar updates
- `reldens.runPlayerAnimation`: Redraws player lifebar
- `reldens.updateGameSizeBefore`: Recalculates fixed position on resize
- `reldens.playersOnRemove`: Removes player lifebar on disconnect
- `reldens.playerEngineAddPlayer`: Processes queued lifebar messages
- `reldens.createAnimationAfter`: Draws object lifebars
- `reldens.objectBodyChanged`: Updates object lifebar
- `reldens.gameEngineShowTarget`: Shows target lifebar on click
- `reldens.gameEngineClearTarget`: Hides previous target lifebar
### Bar Property
The lifebar tracks the stat configured at `client/actions/skills/affectedProperty`, which defaults to `hp`.
To change the tracked stat:
```sql
UPDATE `config` SET `value` = 'mp' WHERE `scope` = 'client' AND `path` = 'actions/skills/affectedProperty';
```
This would make lifebars track magic points instead of health points.
================================================
FILE: .claude/storage-architecture.md
================================================
# Storage & Entity Management Architecture
Complete reference for the storage system and entity management.
## Entity Generation Workflow
1. Define database schema (SQL migrations in `migrations/`)
2. Run `reldens generateEntities --override`
3. Entities are generated in `generated-entities/`
4. Models in each feature's `server/models/` extend generated entities
## Storage Drivers
- `objection-js` (default was objection-js): Uses Knex.js for SQL, direct database access, no validation
- `mikro-orm`: ORM with decorators, supports MongoDB
- `prisma` (current default): Modern ORM with type safety, custom validation, database default support
- Configured via `RELDENS_STORAGE_DRIVER` in `.env`
## Driver Differences
### ObjectionJS
- Direct SQL via Knex query builder
- No field validation before database
- Database handles defaults and constraints
- Foreign keys as direct field values
- Less informative error messages
### Prisma
- Type-safe Prisma Client
- Custom `ensureRequiredFields()` validation before database
- Skips validation for fields with database defaults
- Foreign keys use relation connect syntax: `{players: {connect: {id: 1001}}}`
- VARCHAR foreign key support
- Better error messages for missing required fields
- Metadata-driven field type casting
## Entity Access and Storage System Architecture
### CRITICAL: Understanding getEntity() Return Type
`dataServer.getEntity()` returns a `BaseDriver` instance from `@reldens/storage`, NOT an Entity or Model class.
**What getEntity() Returns:**
```javascript
// Returns BaseDriver instance (or ObjectionJsDriver, PrismaDriver, MikroOrmDriver subclass)
let statsRepository = this.dataServer.getEntity('stats');
// BaseDriver provides unified interface across all storage drivers:
await statsRepository.create({key: 'hp', label: 'Health Points'});
await statsRepository.loadAll();
await statsRepository.loadBy('key', 'hp');
await statsRepository.loadOneBy('key', 'hp');
await statsRepository.updateById(1, {label: 'HP'});
await statsRepository.deleteById(1);
```
**Type Annotation for Repository Properties:**
```javascript
/**
* @typedef {import('@reldens/storage').BaseDriver} BaseDriver
*/
// Correct - driver-agnostic type
/** @type {BaseDriver} */
this.statsRepository = this.dataServer.getEntity('stats');
// WRONG - Entity classes are for admin panel config only
/** @type {StatsEntity} */ // ❌ WRONG
this.statsRepository = this.dataServer.getEntity('stats');
// WRONG - Model classes are driver-specific (objection-js/prisma/mikro-orm)
/** @type {StatsModel} */ // ❌ WRONG
this.statsRepository = this.dataServer.getEntity('stats');
```
## Storage System Component Breakdown
### 1. Entity Classes (`generated-entities/entities/[table]-entity.js`)
- Purpose: Admin panel configuration ONLY
- Define property metadata (types, required fields, display names)
- Define edit/show/list properties for admin UI
- Example: `StatsEntity.propertiesConfig()` returns admin panel config
- Never used for database operations
### 2. Model Classes (`generated-entities/models/{driver}/[table]-model.js`)
- Purpose: ORM-specific model definitions
- Driver-specific paths:
- `models/objection-js/stats-model.js` - ObjectionJS
- `models/prisma/stats-model.js` - Prisma
- `models/mikro-orm/stats-model.js` - MikroORM
- Define table names, relations, schema
- Wrapped by BaseDriver before use
### 3. BaseDriver (`@reldens/storage/lib/base-driver.js`)
- Purpose: Unified database interface
- Wraps raw Model classes
- Provides consistent API across all storage drivers
- THIS IS WHAT `getEntity()` RETURNS
- Methods: create, load, loadBy, loadOneBy, update, delete, count, etc.
- Driver implementations:
- `ObjectionJsDriver` - uses Knex query builder
- `PrismaDriver` - uses Prisma Client
- `MikroOrmDriver` - uses MikroORM EntityManager
### 4. BaseDataServer (`@reldens/storage/lib/base-data-server.js`)
- Purpose: Manages database connection and entity registry
- Has `EntityManager` for storing BaseDriver instances
- `getEntity(key)` retrieves BaseDriver from EntityManager
- Driver implementations:
- `ObjectionJsDataServer`
- `PrismaDataServer`
- `MikroOrmDataServer`
## Entity Loading Flow
1. `EntitiesLoader.loadEntities()` (lib/game/server/entities-loader.js:41)
- Checks `RELDENS_STORAGE_DRIVER` env var (default: 'prisma')
- Loads from `generated-entities/models/{driver}/registered-models-{driver}.js`
- Returns `{entities, entitiesRaw, translations}`
2. `DataServerInitializer.initializeEntitiesAndDriver()` (lib/game/server/data-server-initializer.js:55)
- Creates DataServer instance: `new DriversMap[storageDriver](config)`
- DataServer generates BaseDriver instances for each entity
- Stores in EntityManager registry
3. `dataServer.getEntity(key)` returns BaseDriver from EntityManager
## Usage Examples
```javascript
// 1. Basic CRUD operations
let statsRepo = this.dataServer.getEntity('stats');
let newStat = await statsRepo.create({key: 'hp', label: 'Health'});
let allStats = await statsRepo.loadAll();
let hpStat = await statsRepo.loadOneBy('key', 'hp');
await statsRepo.updateById(hpStat.id, {base_value: 100});
// 2. With relations
let skillData = await this.dataServer
.getEntity('skillsClassLevelUpAnimations')
.loadAllWithRelations();
// 3. Accessing related data from loaded instances
let classPathModel = await this.dataServer.getEntity('skillsClassPath').loadById(1);
let relatedSkills = classPathModel.related_skills_levels_set.related_skills_levels;
```
## Important Notes
- ALWAYS use `BaseDriver` type for repository properties
- Entity classes are NEVER used for database operations
- Model classes are wrapped by BaseDriver - never accessed directly
- Storage driver is configurable: objection-js, prisma (default), mikro-orm
- Relations can be nested
- Entity relations keys are defined in `generated-entities/entities-config.js`
- Custom entity overrides are in `lib/[plugin-folder]/server/entities` or `lib/[plugin-folder]/server/models`
## Generated Entities Structure
The `generated-entities/` directory contains:
- `entities/` - 60+ auto-generated entity classes for all database tables
- `models/` - Custom entity overrides (extend generated entities)
- `entities-config.js` - Entity relationship mappings and configuration
- `entities-translations.js` - Translation/label mappings for admin panel
## Entity Overrides and Database Defaults
**Auto-Populated Fields:**
Some fields should be auto-populated by the database or application logic, not manually entered through the admin panel.
**Example: scores_detail.kill_time**
```javascript
// Database schema (migrations/production/reldens-install-v4.0.0.sql)
// `kill_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
// Entity override (lib/scores/server/entities/scores-detail-entity-override.js)
class ScoresDetailEntityOverride extends ScoresDetailEntity {
static propertiesConfig(extraProps) {
let config = super.propertiesConfig(extraProps);
// Remove kill_time from admin panel edit form
config.editProperties.splice(config.editProperties.indexOf('kill_time'), 1);
return config;
}
}
// Game logic auto-populates when creating through code
// (lib/scores/server/scores-updater.js)
let scoreDetailData = {
player_id: attacker.player_id,
obtained_score: obtainedScore,
kill_time: sc.formatDate(new Date()), // Auto-populated
kill_player_id: props.killPlayerId || null,
kill_npc_id: props.killNpcId || null,
};
```
**How It Works:**
1. Field removed from `editProperties` - not shown in admin panel
2. Database has `DEFAULT CURRENT_TIMESTAMP` - auto-fills when missing
3. Game logic explicitly sets value when creating programmatically
4. Prisma driver skips validation for fields with database defaults
**Important:** With Prisma driver, validation automatically skips required fields that have database defaults, allowing admin panel creates to succeed even when these fields are excluded from the form.
================================================
FILE: .claude/trade-system-implementation.md
================================================
# Trade System Flow - Player-to-Player Trading
## Server to Client Data Flow
**Server sends to each player (via TRADE_SHOW message):**
- `playerToExchangeKey`: The OTHER player's exchange key ('A' or 'B')
- `playerConfirmed`: The OTHER player's confirmation status (for display message)
- `myConfirmed`: THIS player's confirmation status (for button state logic)
- `items`: THIS player's available inventory items (for column 1)
- `traderItemsData`: The OTHER player's item data (for column 3 display)
- `exchangeData`: Complete exchange object with structure: `{ 'A': {itemUid: qty}, 'B': {itemUid: qty} }`
- `isTradeEnd`: Boolean indicating if both players confirmed (triggers trade completion)
**Server determines playerToExchangeKey:**
Line 305 in `lib/inventory/server/message-actions.js`:
```javascript
let playerToExchangeKey = ownerSessionId === playerTo.sessionId ? 'A' : 'B';
```
This identifies which exchange key belongs to the OTHER player (the one being sent data about in the message).
## Three Column Structure
The trade UI displays three columns:
- **Column 1** (`.my-items`): My available inventory items - items I can add to trade
- **Column 2** (`.pushed-to-trade`): Items I'M SENDING to the other player
- **Column 3** (`.got-from-trade`): Items I'M RECEIVING from the other player
**HTML Structure:**
- `.trade-container`
- `.trade-row.trade-items-boxes`
- `.trade-player-col.trade-col-1.my-items` (My Items)
- `.trade-player-col.trade-col-2.pushed-to-trade` (Sending)
- `.trade-player-col.trade-col-3.got-from-trade` (Receiving)
- `.trade-row.trade-confirm-actions`
- `.confirm-action` button
- `.disconfirm-action` button
- `.cancel-action` button
## Client Processing Flow
**When client receives TRADE_SHOW message:**
Line 136-141 in `trade-message-handler.js`:
```javascript
let traderExchangeKey = sc.get(this.message, 'playerToExchangeKey', 'A');
let myExchangeKey = 'A' === traderExchangeKey ? 'B' : 'A';
this.updateItemsList(items, container, exchangeData[myExchangeKey]);
this.updateMyExchangeData((exchangeData[myExchangeKey] || {}), items, myExchangeKey);
this.updateTraderExchangeData((exchangeData[traderExchangeKey] || {}), traderItemsData, traderExchangeKey);
```
**Processing steps:**
1. Extract exchange keys:
- `traderExchangeKey` = value from `playerToExchangeKey` (OTHER player's key)
- `myExchangeKey` = opposite of `traderExchangeKey` (THIS player's key)
2. Update Column 1 (my available items):
- Call `updateItemsList(items, container, exchangeData[myExchangeKey])`
- Passes MY exchange data to check which items to hide (items with full qty in trade)
3. Update Column 2 (items I'm sending):
- Call `updateMyExchangeData(exchangeData[myExchangeKey], items, myExchangeKey)`
- Shows items from MY exchange key
4. Update Column 3 (items I'm receiving):
- Call `updateTraderExchangeData(exchangeData[traderExchangeKey], traderItemsData, traderExchangeKey)`
- Shows items from TRADER's exchange key
## HTML Recreation Pattern
**Every TRADE_SHOW message triggers full HTML recreation:**
Line 181 in `trade-message-handler.js`:
```javascript
container.innerHTML = this.createTradeContainer(tradeItems);
```
Server sends TRADE_SHOW to BOTH players simultaneously when:
- Item added/removed
- Player confirms/disconfirms
- ANY trade state change
**Implications:**
- All buttons and DOM elements are DESTROYED and RECREATED each time
- Event listeners must be re-attached after every update (lines 182-183)
- Server state is the ONLY source of truth
- No client-side state should be maintained between updates
## Button State Logic
**Server sends confirmation statuses:**
- `playerConfirmed`: OTHER player's confirmation status (for display message "Player X CONFIRMED")
- `myConfirmed`: THIS player's confirmation status (for button state logic)
**Button States Calculation:**
Line 183 in `trade-message-handler.js`:
```javascript
this.activateConfirmButtonAction(sc.get(this.message, 'exchangeData', {}));
```
Lines 193-200 in `activateConfirmButtonAction`:
```javascript
let myExchangeKey = sc.get(this.message, 'playerToExchangeKey', 'A');
let traderExchangeKey = 'A' === myExchangeKey ? 'B' : 'A';
let myExchangeData = exchangeData[myExchangeKey] || {};
let traderExchangeData = exchangeData[traderExchangeKey] || {};
let myHasItems = 0 < Object.keys(myExchangeData).length;
let traderHasItems = 0 < Object.keys(traderExchangeData).length;
let hasAnyItems = myHasItems || traderHasItems;
let iConfirmed = sc.get(this.message, 'myConfirmed', false);
```
**Confirm Button:**
- `disabled = iConfirmed || !hasAnyItems`
- Disabled when: Player already confirmed OR no items in trade
- Enabled when: Player not confirmed AND items exist in trade
**Disconfirm Button:**
- `disabled = !iConfirmed`
- Disabled when: Player not confirmed
- Enabled when: Player already confirmed
**Each player sees their own button states based on their own confirmation status from `myConfirmed` field.**
## Example Data Flow
**Scenario: Player A (key='A') adds itemX to trade, then confirms**
**Server state after adding item:**
```javascript
exchangeData = {
'A': {itemX: 1},
'B': {}
}
confirmations = {
'A': false,
'B': false
}
```
**Message sent to Player A:**
```javascript
{
playerToExchangeKey: 'B',
playerConfirmed: false,
myConfirmed: false,
exchangeData: { 'A': {itemX: 1}, 'B': {} },
items: {...},
traderItemsData: {}
}
```
**Player A UI state:**
- Column 1: Shows Player A's available items (itemX hidden if full qty placed)
- Column 2: Shows `exchangeData['A']` = {itemX: 1} (sending to Player B)
- Column 3: Shows `exchangeData['B']` = {} (receiving from Player B - empty)
- Confirm button: ENABLED (myConfirmed=false, hasAnyItems=true)
- Disconfirm button: DISABLED (myConfirmed=false)
**Message sent to Player B:**
```javascript
{
playerToExchangeKey: 'A',
playerConfirmed: false,
myConfirmed: false,
exchangeData: { 'A': {itemX: 1}, 'B': {} },
items: {...},
traderItemsData: {itemX: {...}}
}
```
**Player B UI state:**
- Column 1: Shows Player B's available items
- Column 2: Shows `exchangeData['B']` = {} (sending to Player A - empty)
- Column 3: Shows `exchangeData['A']` = {itemX: 1} (receiving from Player A)
- Display message: No confirmation message (playerConfirmed=false)
- Confirm button: ENABLED (myConfirmed=false, hasAnyItems=true)
- Disconfirm button: DISABLED (myConfirmed=false)
**After Player A clicks confirm:**
Server updates confirmations:
```javascript
confirmations = {
'A': true,
'B': false
}
```
**Message sent to Player A:**
```javascript
{
playerToExchangeKey: 'B',
playerConfirmed: false,
myConfirmed: true,
// ... rest same
}
```
**Player A UI state:**
- Confirm button: DISABLED (myConfirmed=true)
- Disconfirm button: ENABLED (myConfirmed=true)
**Message sent to Player B:**
```javascript
{
playerToExchangeKey: 'A',
playerConfirmed: true,
myConfirmed: false,
// ... rest same
}
```
**Player B UI state:**
- Display message: "Player A CONFIRMED" (playerConfirmed=true)
- Confirm button: ENABLED (myConfirmed=false)
- Disconfirm button: DISABLED (myConfirmed=false)
## Toggle Actions (Column 1 Only)
**CSS Behavior (lines 373-405 in items-system.scss):**
```scss
.my-items .trade-item {
.actions-container.trade-actions {
display: none; // Hidden by default
&.trade-actions-expanded {
display: block; // Visible when toggled
position: absolute; // Float below item
top: 54px;
left: 0;
z-index: 3;
background: $cBlack;
border: 1px solid $cWhite;
border-radius: 6px;
padding: 4px;
}
}
}
```
**Important:** Toggle behavior with absolute positioning applies ONLY to column 1 (`.my-items`). Columns 2 and 3 do not have toggle behavior - their actions are always visible.
## Files Involved
**Client:**
- `lib/inventory/client/trade-message-handler.js` - Main trade UI handler
- `lib/inventory/client/trade-items-helper.js` - Item instance creation
- `theme/default/css/items-system.scss` - Trade UI styles
**Server:**
- `lib/inventory/server/message-actions.js` - Trade message handling
- `lib/inventory/server/trade.js` - Trade logic
**Constants:**
- `lib/objects/constants.js` - Trade action constants (ADD, REMOVE, CONFIRM, DISCONFIRM)
- `lib/inventory/constants.js` - Inventory action constants (TRADE_START, TRADE_SHOW, etc.)
**Translations:**
- `lib/inventory/client/snippets/en_US.js` - UI labels (trade.actions.disconfirm)
## CSS Styling
**Player Confirmed Message** (lines 268-284 in items-system.scss):
- Styled block with border and background
- Empty state handling with transparent background
**Button Layout** (lines 303-310):
- Flexbox with center justification
- No float positioning
**Remove Button** (lines 358-366):
- Absolute positioning at `right: -10px`
- Icon size 20px
**Toggle Actions** (lines 373-405):
- Scoped to `.my-items` column only
- Absolute positioning with floating styles
- Other columns display actions inline without toggle
================================================
FILE: .claude/ui-visibility-configuration.md
================================================
# UI Visibility Configuration
## Overview
This document describes the configuration system for controlling visibility of UI elements that can be displayed separately for the current player versus other players and NPCs.
---
## Life Bar Visibility Configuration
### Purpose
Controls the display of health bars above player and NPC sprites. Allows independent configuration for current player, other players, and NPCs/enemies.
### Configuration Paths
- **Scope**: `client`
- **Base Path**: `ui/lifeBar`
- **Type**: boolean (type 3)
### Visibility Properties
**showCurrentPlayer**
- Path: `client/ui/lifeBar/showCurrentPlayer`
- Default: `0` (disabled)
- Controls: Current player's lifebar visibility
- Use case: Disable when using alternative UI systems like stat bars in player info panel
**showAllPlayers**
- Path: `client/ui/lifeBar/showAllPlayers`
- Default: `0` (disabled)
- Controls: Other players' lifebars visibility
- Use case: Enable for PvP-focused games where seeing other players' health is important
**showEnemies**
- Path: `client/ui/lifeBar/showEnemies`
- Default: `1` (enabled)
- Controls: NPCs and enemies lifebars visibility
- Use case: Disable for less cluttered visual experience
**showOnClick**
- Path: `client/ui/lifeBar/showOnClick`
- Default: `1` (enabled)
- Controls: Whether lifebars show only when target is clicked
- Works for: Both other players and objects when their specific show flags are disabled
### Implementation Flow
**File**: `lib/users/client/lifebar-ui.js`
**Method**: `canShowPlayerLifeBar(playerId)`
Flow:
1. Check if player is current player by comparing playerId with gameManager.getCurrentPlayer().playerId
2. If current player: return value of `barConfig.showCurrentPlayer`
3. If other player: check `barConfig.showAllPlayers` first, then `barConfig.showOnClick` if false
4. Draw lifebar only if check returns true
**Customizable Fields**:
- `showCurrentPlayer` - boolean - stored in `this.barConfig.showCurrentPlayer`
- `showAllPlayers` - boolean - stored in `this.barConfig.showAllPlayers`
- `showEnemies` - boolean - stored in `this.barConfig.showEnemies`
- `showOnClick` - boolean - stored in `this.barConfig.showOnClick`
### Configuration Examples
Hide current player lifebar:
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showCurrentPlayer';
```
Show all players lifebars always:
```sql
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showOnClick';
```
Hide all lifebars:
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showCurrentPlayer';
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showEnemies';
```
---
## Player Names Visibility Configuration
### Purpose
Controls the display of character names above player sprites. Allows independent configuration for current player versus other players.
### Configuration Paths
- **Scope**: `client`
- **Base Path**: `ui/players`
- **Type**: boolean (type 3)
### Visibility Properties
**showCurrentPlayerName**
- Path: `client/ui/players/showCurrentPlayerName`
- Default: `0` (disabled)
- Controls: Current player's name visibility
- Use case: Disable for cleaner visual experience when player info is shown in UI panel
**showNames**
- Path: `client/ui/players/showNames`
- Default: `1` (enabled)
- Controls: Other players' names visibility
- Use case: Disable for less cluttered multiplayer experience
**showNamesLimit**
- Path: `client/ui/players/showNamesLimit`
- Default: `10`
- Controls: Maximum name length before truncation with ellipsis
- Use case: Prevent long names from cluttering the screen
### Implementation Flow
**File**: `lib/users/client/player-engine.js`
**Method**: `showPlayerName(id)`
Flow:
1. Determine which config to check using ternary: `id === this.playerId ? showCurrentPlayerName : showNames`
2. Return false if config value is false
3. Validate player exists and has name property
4. Apply name length limit if configured
5. Attach text sprite to player using SpriteTextFactory
**Method**: `updateNamePosition(playerSprite)`
Flow:
1. Determine which config to check: `playerId === this.playerId ? showCurrentPlayerName : showNames`
2. Return false if config is disabled or nameSprite doesn't exist
3. Calculate relative position and update sprite coordinates
**Customizable Fields**:
- `globalConfigShowCurrentPlayerName` - boolean - loaded from `client/ui/players/showCurrentPlayerName`
- `globalConfigShowNames` - boolean - loaded from `client/ui/players/showNames`
- `globalConfigShowNamesLimit` - number - loaded from `client/ui/players/showNamesLimit`
- `globalConfigNameText` - object - loaded from `client/ui/players/nameText` with style properties
### Configuration Examples
Hide current player name:
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';
```
Hide all other players names:
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';
```
Show both current and other players names:
```sql
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';
```
Increase name length limit:
```sql
UPDATE `config` SET `value` = '20' WHERE `scope` = 'client' AND `path` = 'ui/players/showNamesLimit';
```
---
## Common Patterns
### Pattern 1: Clean Current Player Display
When using custom UI panels for current player information:
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showCurrentPlayer';
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';
```
Result: Current player has no floating UI elements, all info shown in panels
### Pattern 2: Minimal Multiplayer Display
For focused gameplay with minimal distractions:
```sql
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showOnClick';
```
Result: Other players show info only when clicked
### Pattern 3: Full Visibility
For PvP or cooperative multiplayer:
```sql
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showCurrentPlayer';
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';
UPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';
UPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showOnClick';
```
Result: All players always show names and health bars
---
## Implementation Details
### Code Organization
Both systems follow the same architectural pattern:
1. Configuration loaded in constructor from gameManager.config
2. Single method determines visibility based on player type (current vs other)
3. Ternary operator selects appropriate config property
4. Early return if visibility check fails
5. Render or update UI element if check passes
### Property Access Pattern
Properties are stored as class instance variables for performance:
```javascript
this.barConfig = gameManager.config.get('client/ui/lifeBar');
this.globalConfigShowCurrentPlayerName = Boolean(this.config.get('client/ui/players/showCurrentPlayerName'));
this.globalConfigShowNames = Boolean(this.config.get('client/ui/players/showNames'));
```
### Conditional Logic Pattern
Both implementations use clean ternary logic:
```javascript
let shouldShow = id === this.playerId ? this.configForCurrent : this.configForOthers;
if(!shouldShow){
return false;
}
```
### Integration Points
**Life Bars**:
- Created in: `lib/users/client/plugin.js` during `reldens.beforeCreateEngine` event
- Updated on: `reldens.playerStatsUpdateAfter`, `reldens.runPlayerAnimation`, `reldens.updateGameSizeBefore`
- Removed on: `reldens.playersOnRemove`
**Player Names**:
- Created in: `lib/users/client/player-engine.js` during `addPlayer()` call
- Updated on: Every animation frame during `updatePlayerState()`
- Removed on: `removePlayer()` call
---
## Migration Notes
When adding these configurations to existing installations:
Development migration file:
```sql
INSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES
('client', 'ui/lifeBar/showCurrentPlayer', '0', 3),
('client', 'ui/players/showCurrentPlayerName', '0', 3);
```
Default values set to `0` to avoid changing existing behavior where alternative UI systems may already be implemented.
After migration, users can explicitly enable these features if desired.
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: reldens
open_collective: # Replace with a single Open Collective username
ko_fi: damianpastorini
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: damian-pastorini
issuehunt: damian-pastorini
otechie: # Replace with a single Otechie username
# Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
custom: https://www.paypal.com/paypalme/damianpastorini
================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL"
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
schedule:
- cron: "48 17 * * 0"
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ javascript ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
queries: +security-and-quality
- name: Autobuild
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{ matrix.language }}"
================================================
FILE: .gitignore
================================================
/.cache
/.env
/.idea
/knexfile.js
/node_modules
/npm-debug*
/test
/ts-node*
/v8-compile-cache*
/dev
winpty.exe.stackdump
/.parcel-cache
/tests/config.json
/prisma
/.claude/settings.json
/.claude/settings.local.json
/.claude/instructions.md
/CLAUDE.local.md
/.claude/skills/
================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
Reldens is an MMORPG Platform (v4.0.0-beta.39) built on Node.js, designed for developers to create multiplayer games. The platform integrates:
- **Server**: Colyseus 0.16 for multiplayer game server
- **Client**: Phaser 3 for game engine, Parcel for bundling
- **Database**: Supports multiple storage drivers (objection-js, mikro-orm, prisma)
- **Architecture**: Client-server with authoritative server, real-time synchronization via WebSockets
**Node Version**: >= 20.0.0
### Sub-Packages
- **@reldens/utils** - Core utilities, Shortcuts class (imported as `sc`), EventsManagerSingleton, Logger
- **@reldens/server-utils** - Server utilities, FileHandler, configuration helpers
- **@reldens/storage** - Multi-ORM database layer (ObjectionJS, MikroORM, Prisma)
- **@reldens/cms** - Content management system and admin panel
- **@reldens/items-system** - Items and inventory system
- **@reldens/modifiers** - Stats and modifiers system
- **@reldens/skills** - Skills and abilities system
## Essential Commands
```bash
# Testing
npm test
node tests/manager.js --filter="test-name" --break-on-error
# Building
reldens buildSkeleton # Build both styles and client
reldens fullRebuild # Complete rebuild from scratch
# Database
reldens generateEntities [--override] # Generate entities from database schema
# User management
reldens createAdmin --user=username --pass=password --email=email@example.com
reldens resetPassword --user=username --pass=newpassword
```
**Full command reference**: See `.claude/commands-reference.md`
## Architecture Overview
### Client-Server Organization
The codebase follows a **client/server split architecture** within each feature module:
```
lib/
├── {feature}/
│ ├── client/ # Client-side code (Phaser, UI, rendering)
│ ├── server/ # Server-side code (Colyseus rooms, logic)
│ ├── constants.js # Shared constants
│ └── schemas/ # Colyseus state schemas (if applicable)
```
### Core Entry Points
- **Server**: `server.js` → `lib/game/server/manager.js` (ServerManager)
- **Client**: `client.js` → `lib/game/client/game-manager.js` (GameManager)
- **Theme**: `theme/default/index.js` initializes client with custom plugins
### Feature Modules (23 Total)
The platform includes 23 feature modules: Game, Rooms, World, Config, Features, Actions, Inventory, Respawn, Rewards, Scores, Teams, Users, Chat, Audio, Prediction, Admin, Firebase, Ads, Import, Objects, Snippets, Bundlers.
**Detailed list**: See `.claude/feature-modules.md`
## Configuration System
Reldens uses a **database-driven configuration** with runtime overrides:
1. **Database Config** (`config` table): Path-based keys, scoped by `scope` field
2. **Environment Variables** (`.env`): Prefix `RELDENS_*` for all settings
3. **Custom Classes**: Passed via `customClasses` to override defaults
**Key Environment Variables:**
- `RELDENS_STORAGE_DRIVER` - Storage driver (objection-js, mikro-orm, prisma)
- `RELDENS_DB_HOST`, `RELDENS_DB_PORT`, `RELDENS_DB_NAME`, `RELDENS_DB_USER`, `RELDENS_DB_PASSWORD`
- `RELDENS_HOT_PLUG` - Enable hot-plug configuration updates (0/1)
**Full environment variables list**: See `.claude/environment-variables.md`
## Events System
The platform uses **@reldens/utils EventsManagerSingleton** for extensibility:
**Common Event Patterns**:
- `reldens.{action}Before` - Hook before operation
- `reldens.{action}After` - Hook after operation
- Events are synchronous (`emitSync`) or async (`emit`)
**Key Events**:
- `reldens.serverConfigFeaturesReady` - Features loaded
- `reldens.beforeJoinGame` - Before player joins
- `reldens.startGameAfter` - Game initialized
- `reldens.roomLoginOnAuth` - Custom authentication logic
**Plugin Pattern**:
```javascript
class ServerPlugin {
setup({events}) {
events.on('reldens.serverConfigFeaturesReady', (props) => {
// Custom logic here
});
}
}
```
## Storage & Entity Management
### CRITICAL: Understanding getEntity()
`dataServer.getEntity()` returns a `BaseDriver` instance from `@reldens/storage`, NOT an Entity or Model class.
```javascript
// Correct - returns BaseDriver
let statsRepository = this.dataServer.getEntity('stats');
// BaseDriver provides unified interface:
await statsRepository.create({key: 'hp', label: 'Health Points'});
await statsRepository.loadAll();
await statsRepository.loadOneBy('key', 'hp');
await statsRepository.updateById(1, {label: 'HP'});
```
**Type Annotation:**
```javascript
/** @type {import('@reldens/storage').BaseDriver} */
this.statsRepository = this.dataServer.getEntity('stats');
```
**Storage Drivers:**
- `prisma` (current default): Modern ORM with type safety, custom validation
- `objection-js`: Uses Knex.js, direct SQL, no validation
- `mikro-orm`: ORM with decorators, supports MongoDB
**Detailed architecture**: See `.claude/storage-architecture.md`
**Entity list**: See `.claude/entities-reference.md`
## Theme & Customization
**Theme Structure** (`theme/`):
- `plugins/` - Custom client/server plugins for game-specific logic
- `default/` - Default theme assets (HTML, CSS, sprites, audio)
- `admin/` - Admin panel customizations
**Theme Management:**
ThemeManager (`lib/game/server/theme-manager.js`) handles asset copying, bundling, and CSS compilation.
### Client Bundling Best Practices
**CRITICAL**: Always use `themeManager.createClientBundle()` instead of calling `buildClient()` or `buildCss()` directly:
- **createClientBundle()** - Wrapper that checks `RELDENS_ALLOW_RUN_BUNDLER` environment variable (used during server startup)
- **buildClient()** - Direct method that checks `RELDENS_ALLOW_BUILD_CLIENT` environment variable
- **buildCss()** - Direct method that checks `RELDENS_ALLOW_BUILD_CSS` environment variable
**Environment Variables:**
- `RELDENS_ALLOW_RUN_BUNDLER` - Controls `createClientBundle()` execution (default: 0)
- `RELDENS_ALLOW_BUILD_CLIENT` - Controls `buildClient()` execution (default: 1)
- `RELDENS_ALLOW_BUILD_CSS` - Controls `buildCss()` execution (default: 1)
**Why this matters:** Production servers can regenerate clients and run Parcel builds for hot-reloading. These environment variables allow you to control when bundling happens, preventing unexpected builds during startup or deployment.
## Colyseus 0.16 - CRITICAL State Synchronization
**CRITICAL TIMING ISSUE**: Colyseus 0.16 state synchronization is asynchronous.
### Problem Pattern (WRONG)
```javascript
listenMessages(room, gameManager) {
if(!room.state || !room.state.bodies){
return false; // ❌ WRONG - callbacks never set up!
}
this.setAddBodyCallback(room, gameManager);
}
```
### Correct Pattern (RIGHT)
```javascript
listenMessages(room, gameManager) {
if(!room.state || !room.state.bodies){
room.onStateChange.once((state) => {
this.setAddBodyCallback(room, gameManager); // ✅ Wait for state
});
return false;
}
this.setAddBodyCallback(room, gameManager);
}
```
**Alternative - Use Reactive Patterns:**
```javascript
activateRoom(room) {
this.playersManager = RoomStateEntitiesManager.onEntityAdd(
room,
'players',
(player, key) => {
this.handlePlayerAdded(player, key);
}
);
}
```
**CRITICAL**: Colyseus auto-cleans all listeners. Never store manager references or add manual disposal code unless explicitly needed.
### Room Lifecycle
1. `onCreate(options)`: Initialize world, physics, objects
2. Player joins → `onJoin(client, options)`
3. Message handling → `onMessage(client, message)`
4. Player leaves → `onLeave(client, consented)`
5. Room disposal → `onDispose()`
## Common Development Patterns
### Adding a New Feature
1. Create feature module in `lib/{feature-name}/`
2. Add database table in `migrations/`
3. Create client/server subdirectories
4. Add feature entry to `features` table
5. Register in `lib/features/server/config-server.js`
6. Implement `setup()` method to hook events
### Modifying Game Logic
- **Combat/Skills**: Edit `lib/actions/server/battle.js` or `pve.js`
- **Player Stats**: Configure via database `stats` table
- **Room Behavior**: Extend `RoomScene` or hook `reldens.createRoomAfter` event
- **Client Rendering**: Modify Phaser scenes in `lib/game/client/scene-*.js`
### Working with Database
- Always use entity models via `dataServer.getEntity()`, never raw SQL
- Generated entities are read-only; extend in `server/models/`
- Use migrations for schema changes
- Regenerate entities after schema changes: `reldens generateEntities --override`
## Important Notes
- **Authoritative Server**: All game logic runs on server; client is display-only
- **Hot Plug**: Admin panel changes reload without restart if `RELDENS_HOT_PLUG=1`
- **Logging**: Use `@reldens/utils/Logger` (configurable via `RELDENS_LOG_LEVEL`)
- **File Operations**: Always use `@reldens/server-utils FileHandler` (never Node.js `fs`)
- **Shortcuts Class**: Import as `sc` from `@reldens/utils` - provides `sc.get`, `sc.hasOwn`, `sc.isArray`, etc.
- **Colyseus 0.16**: All client callbacks use `StateCallbacksManager` and `RoomStateEntitiesManager`
- **Buffer Polyfill**: Required for Parcel bundling with Colyseus 0.16
## Analysis Approach
When working on code issues:
- Always investigate thoroughly before making changes
- Read related files completely before proposing solutions
- Trace execution flows and dependencies
- Provide proof for issues, never guess or assume
- Verify file contents before creating patches
- A variable with an unexpected value is not an issue, it is the result of a previous issue
## Community & Support
- **Discord**: https://discord.gg/HuJMxUY
- **Demo**: https://dev.reldens.com/
- **Documentation**: https://www.reldens.com/documentation/installation
- **Issues**: https://github.com/damian-pastorini/reldens/issues
- **Contact**: info@dwdeveloper.com
## Detailed Reference Documentation
- **Commands**: `.claude/commands-reference.md` - All CLI commands
- **Environment Variables**: `.claude/environment-variables.md` - All RELDENS_* variables
- **Feature Modules**: `.claude/feature-modules.md` - All 23 feature modules
- **Storage Architecture**: `.claude/storage-architecture.md` - Entity management deep dive
- **Entities**: `.claude/entities-reference.md` - All 60+ entity types
- **Installer**: `.claude/installer-guide.md` - Web-based installation wizard guide
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2018 Damian Alberto Pastorini
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
<div style="width: 100%; background-color: #000000; text-align: center;">
<a href="https://github.com/damian-pastorini/reldens">
<img alt="Reldens - You can make it" src="https://www.dwdeveloper.com/media/reldens/reldens-mmorpg-platform.png"/>
</a>
</div>
---
<h3 align="center">
<p>
<a href="https://discord.gg/HuJMxUY">Join our Discord community!</a>
</p>
<a href="https://discord.gg/HuJMxUY">
<img alt="Reldens - Discord" src="https://img.shields.io/badge/discord-%235865F2?style=for-the-badge&logo=discord&logoColor=white"/>
</a>
</h3>
---
# [Reldens - MMORPG Platform](https://www.reldens.com/)
Welcome to Reldens, a platform designed to empower developers in creating multiplayer games.
With a wide array of features, Reldens enables developers to craft a rich gaming experience without grappling with the complexities usually associated with making a multiplayer game secure and efficient over any network.
Built with popular development tools such as Node.js, Parcel, Colyseus, Phaser, and more, integrated with various database engines, and following robust development practices, the platform ensures security, ease of use, and high customization for developers.
While the current stage of the platform is tailored for developers, ongoing improvements to the administration panel aim to make game creation accessible to non-developers in the future.
---
## [Check our website for the latest news!](https://www.reldens.com/ "Check our website for the latest news")
---
## [Features Overview](https://www.reldens.com/features)
[First to mention, if the feature you need is not available, you can request a feature here: https://www.reldens.com/features-request](https://www.reldens.com/features-request)
As for the latest version released, the platform will provide you with the following features.
- Installation GUI: Easy to install through the web.
- Administration Panel: Manage every single aspect of your game through the panel.
- Automatic data generators and import commands for attributes, levels, maps, objects, etc.
- Trade System: Between Players (trade) and NPCs (buy and sell).
- Full In-game Chat: Global, by room, and private messages between users with chat types and split in tabs.
- Player Stats: Fully configurable stats! HP? MP? Magic? Stamina, you can set up as much as you need for your game logic.
- Items System: create all kinds of items (usable and equipment).
- Attacks, PVP, and PVE: create all kinds of skills, attacks, bullet type (can be dodged), target type (can't be dodged), fight with other players or just with NPCs.
- NPC's, Enemies, and Respawn Areas: Set up NPC's with different options to interact and create respawn areas.
- Teams and Clans System: Create, join, dismantle teams and clans, bonus based on clan level, and more.
- Drops and Rewards: NPCs can drop any kind of items (rewards), and it can be configured to be split among team members.
- Game rewards: you can configure rewards based on game events like daily or weekly login, it's events managed.
- Game scores: configurable games scores, for example, keep track on monster kills and get a global scores table view.
- Physics Engine and Pathfinder: Authoritative server with a physics engine and pathfinder.
- Gravity World: Set up your rooms with or without gravity to get totally different kinds of gameplay.
- Sounds System: Configurable multiple sound categories for any animation or scene.
- In-game Ads: Integrated with CrazyGames and GameMonetize to show ads in-game.
- Minimap: Optional configurable minimap.
- Configurable Players Name and Life-bars visibility.
- Terms and Conditions: Ready to be set up as you need.
- Guest Users.
- Users Registration: Continue playing later and double login invalidation.
- Multiple Players Creation.
- Registration and Login Integrated with Firebase.
- Multiple servers switch support, from room-A in server-A, to room-B in server-B without notice.
- Database Ready: With multiple drivers for different storage or using MySQL by default, all you need will be saved.
---
## [Installation](https://www.reldens.com/documentation/installation "Installation")
Please follow the Installation Guide: https://www.reldens.com/documentation/installation.
---
## [Demo](https://dev.reldens.com/)
We use this demo to show how many features are available.
To access you can register in the following link (the basic registration will require email, user, and password, but
none real data is required here):
- [https://demo.reldens.com/](https://dev.reldens.com/)
Your email is required to access the server admin:
- [https://demo.reldens.com/reldens-admin/](https://demo.reldens.com/reldens-admin/)
---
## Contact us
Join our Discord channel: [https://discord.gg/HuJMxUY](https://discord.gg/HuJMxUY) or contact us by email [info@dwdeveloper.com](mailto:info@dwdeveloper.com).
## Support us! :)
[](https://ko-fi.com/I2I81VISA)
[](https://www.patreon.com/bePatron?u=18074832)
If you like to contribute in any way or donate to support the project please also feel free to contact me at [info@dwdeveloper.com](mailto:info@dwdeveloper.com).
## Contributors
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center">
<a href="https://github.com/damian-pastorini">
<img src="https://avatars.githubusercontent.com/u/1211779?v=4" width="100px;" alt="Damian Pastorini"/><br/>
<sub><b>Damian Pastorini</b></sub>
</a><br/>
<a href="https://github.com/damian-pastorini/reldens/commits?author=damian-pastorini" title="Owner">💻</a>
</td>
<td align="center">
<a href="https://github.com/luciovicentini">
<img src="https://avatars.githubusercontent.com/u/16654212?v=4" width="100px;" alt="Lucio Vicentini"/><br/>
<sub><b>Lucio Vicentini</b></sub>
</a><br/>
<a href="#" title="Answering Questions">💬</a> <a href="https://github.com/damian-pastorini/reldens/commits?author=luciovicentini" title="Code">💻</a>
</td>
<td align="center">
<a href="https://github.com/TheXerxi">
<img src="https://avatars.githubusercontent.com/u/146131154?v=4" width="100px;" alt="Joel P."/><br/>
<sub><b>Joel P.</b></sub>
</a><br/>
<a href="#" title="Artist">🎨</a> <a href="https://github.com/damian-pastorini/reldens/pull/256" title="Code">💻</a>
</td>
</tr>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
---
[](https://www.npmjs.com/package/reldens)
[](https://github.com/damian-pastorini/reldens)
[](https://discord.gg/HuJMxUY)
[](https://github.com/damian-pastorini/reldens)
---
## License
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fdamian-pastorini%2Freldens?ref=badge_large)
---
#### [By DwDeveloper](https://www.dwdeveloper.com/ "DwDeveloper")
================================================
FILE: bin/commander.js
================================================
#! /usr/bin/env node
/**
*
* Reldens - Commands
*
*/
const dotenv = require('dotenv');
const { spawn } = require('child_process');
const { CreateAdmin } = require('../lib/users/server/create-admin');
const { ResetPassword } = require('../lib/users/server/reset-password');
const { ThemeManager } = require('../lib/game/server/theme-manager');
const { PackagesInstallation } = require('../lib/game/server/installer/packages-installation');
const { ServerManager } = require('../server');
const { FileHandler } = require('@reldens/server-utils');
const { Logger, sc } = require('@reldens/utils');
class Commander
{
projectRoot = process.cwd();
reldensModulePath = FileHandler.joinPaths(this.projectRoot, 'node_modules', 'reldens');
projectThemeName = 'default';
jsSourceMaps = '1' === process.env.RELDENS_JS_SOURCEMAPS;
cssSourceMaps = '1' === process.env.RELDENS_CSS_SOURCEMAPS;
availableCommands = ['test', 'help', 'generateEntities', 'createAdmin', 'resetPassword'];
command = '';
prepareCommand()
{
if(!sc.hasOwn(process.env, 'RELDENS_LOG_LEVEL')){
process.env.RELDENS_LOG_LEVEL = 7;
}
Logger.info('- Reldens - ');
Logger.info('Use "help" as argument to see all the available commands:');
Logger.info('$ node scripts/reldens-commands.js help');
if(!FileHandler.exists(this.projectRoot)){
Logger.error('Can not access parent folder, check permissions.');
return false;
}
let parseResult = this.parseArgs();
if(!parseResult){
return false;
}
if(-1 !== this.availableCommands.indexOf(this.command)){
return true;
}
this.packagesInstallation = new PackagesInstallation({projectRoot: this.projectRoot});
if('createApp' === this.command){
if(!this.ensureReldensPackage()){
return false;
}
}
this.themeManager = new ThemeManager(this);
if(!this.validateThemeManagerCommand()){
return false;
}
this.themeManager.setupPaths(this);
Logger.info('Command "'+this.command+'" ready to be executed.');
Logger.info('Theme: '+this.projectThemeName);
return true;
}
ensureReldensPackage()
{
if(this.packagesInstallation.isPackageInstalled('reldens')){
return true;
}
Logger.info('Reldens package not found in node_modules.');
Logger.info('Installing reldens package...');
if(!this.packagesInstallation.processPackages(['reldens'], 'install')){
Logger.error('Failed to install reldens package.');
return false;
}
Logger.info('Reldens package installed successfully.');
return true;
}
parseArgs()
{
let args = process.argv;
if(2 === args.length){
Logger.error('Missing arguments.');
return false;
}
let extractedParams = args.slice(2);
this.command = extractedParams[0];
if(-1 !== this.availableCommands.indexOf(this.command)){
return true;
}
if(2 === extractedParams.length && '' !== extractedParams[1]){
this.projectThemeName = extractedParams[1];
}
return true;
}
validateThemeManagerCommand()
{
if(-1 !== this.availableCommands.indexOf(this.command)){
return true;
}
if('execute' === this.command || 'function' !== typeof this.themeManager[this.command]){
Logger.error('Invalid command:', this.command);
return false;
}
return true;
}
async execute()
{
await this.themeManager[this.command]();
Logger.info('Command executed!');
process.exit();
}
test()
{
let crudTestPath = FileHandler.joinPaths(this.projectRoot, 'crud-test');
FileHandler.createFolder(crudTestPath);
FileHandler.remove(crudTestPath);
Logger.info('Test OK.');
}
generateEntities()
{
this.loadEnvironmentConfig();
let args = [
'reldens-storage',
'generateEntities',
'--user='+process.env.RELDENS_DB_USER,
'--pass='+process.env.RELDENS_DB_PASSWORD,
'--host='+process.env.RELDENS_DB_HOST,
'--database='+process.env.RELDENS_DB_NAME,
'--driver='+(process.env.RELDENS_STORAGE_DRIVER || 'objection-js'),
'--client='+process.env.RELDENS_DB_CLIENT
];
let overrideArg = process.argv.find(arg => '--override' === arg);
if(overrideArg){
args.push('--override');
}
Logger.info('Running: npx '+args.join(' '));
let child = spawn('npx', args, {
stdio: 'inherit',
cwd: this.projectRoot,
shell: true
});
child.on('exit', (code) => {
process.exit(code || 0);
});
}
async createAdmin()
{
Logger.info('Creating admin user...');
let args = this.getCommandArgs(['user', 'pass', 'email']);
let serverManager = await this.initializeServerManager();
let service = new CreateAdmin(serverManager);
let result = await service.create(args.user, args.pass, args.email);
process.exit(result ? 0 : 1);
}
async resetPassword()
{
Logger.info('Resetting user password...');
let args = this.getCommandArgs(['user', 'pass']);
let serverManager = await this.initializeServerManager();
let service = new ResetPassword(serverManager);
let result = await service.reset(args.user, args.pass);
process.exit(result ? 0 : 1);
}
getCommandArgs(requiredArgs)
{
let args = process.argv.slice(2);
let parsedArgs = {};
for(let arg of args){
if(!arg.includes('=')){
continue;
}
let [key, value] = arg.split('=');
let cleanKey = key.replace('--', '');
parsedArgs[cleanKey] = value;
}
for(let requiredArg of requiredArgs){
if(!parsedArgs[requiredArg]){
Logger.error('Missing required argument: --'+requiredArg);
process.exit(1);
}
}
return parsedArgs;
}
loadEnvironmentConfig()
{
let envPath = FileHandler.joinPaths(this.projectRoot, '.env');
if(!FileHandler.exists(envPath)){
Logger.error('.env file not found at: '+envPath);
process.exit(1);
}
dotenv.config({path: envPath});
}
async initializeServerManager()
{
this.loadEnvironmentConfig();
let serverManager = new ServerManager({
projectRoot: this.projectRoot,
projectThemeName: this.projectThemeName
});
await serverManager.initializeStorage(serverManager.rawConfig, serverManager.dataServerDriver);
await serverManager.initializeConfigManager();
return serverManager;
}
help()
{
Logger.info(' - Available commands:'
+"\n"+'createApp - Create base project, copy all default files like in the skeleton.'
+"\n"+'resetDist - Delete and create the "dist" folder.'
+"\n"+'removeDist - Delete the "dist" folder.'
+"\n"+'installDefaultTheme - Copy theme and packages from node_modules into the current project theme.'
+"\n"+'copyAssetsToDist - Copy project theme assets into the "dist" folder.'
+"\n"+'copyKnexFile - Copy the knexfile.js sample into the project.'
+"\n"+'copyEnvFile - Copy the .env file sample into the project.'
+"\n"+'copyIndex - Copy the index file sample into the project.'
+"\n"+'copyDefaultAssets - Copy the reldens module default assets into the "dist/assets" folder.'
+"\n"+'copyDefaultTheme - Copy the reldens module default theme into the project theme.'
+"\n"+'copyPackage - Copy the reldens module packages into the project.'
+"\n"+'buildCss [theme-folder-name] - Builds the project theme styles.'
+"\n"+'buildClient [theme-folder-name] - Builds the project theme index.html.'
+"\n"+'buildSkeleton - Builds the styles and project theme index.html.'
+"\n"+'copyNew - Copy all default files for the fullRebuild.'
+"\n"+'fullRebuild - Rebuild the Skeleton from scratch.'
+"\n"+'installSkeleton - Installs Skeleton.'
+"\n"+'copyServerFiles - Reset the "dist" folder and runs a fullRebuild.'
+"\n"+'generateEntities [--override] - Generate entities from database using .env credentials.'
+"\n"+'createAdmin --user=X --pass=Y --email=Z - Create admin user with specified credentials.'
+"\n"+'resetPassword --user=X --pass=Y - Reset password for specified user.');
}
}
module.exports = new Commander();
================================================
FILE: bin/generate.js
================================================
#! /usr/bin/env node
const {
PlayersExperiencePerLevel,
MonstersExperiencePerLevel,
AttributesPerLevel
} = require('@reldens/game-data-generator');
const {
RandomMapGenerator,
LayerElementsObjectLoader,
LayerElementsCompositeLoader,
MultipleByLoaderGenerator,
MultipleWithAssociationsByLoaderGenerator
} = require('@reldens/tile-map-generator');
const { FileHandler } = require('@reldens/server-utils');
const { Logger } = require('@reldens/utils');
/**
*
* Commands:
*
* $ npx reldens-generate players-experience-per-level ./generate-data/players-experience-per-level.json
*
* $ npx reldens-generate monsters-experience-per-level ./generate-data/monsters-experience-per-level.json ./generate-data/players-level-sample.json
*
* $ npx reldens-generate attributes-per-level ./generate-data/attributes-per-level.json
*
* $ npx reldens-generate maps ./generate-data/map-data.json LayerElementsObjectLoader
*
* $ npx reldens-generate maps ./generate-data/map-composite-data.json LayerElementsCompositeLoader
*
* $ npx reldens-generate maps ./generate-data/map-composite-data-with-names.json MultipleByLoaderGenerator
*
* $ RELDENS_LOG_LEVEL=9 npx reldens-generate maps ./generate-data/map-composite-data-with-associations.json MultipleWithAssociationsByLoaderGenerator
*
*/
let mapsGenerateModes = {
LayerElementsObjectLoader: async (commandParams) => {
let loader = new LayerElementsObjectLoader(commandParams);
await loader.load();
let generator = new RandomMapGenerator(loader.mapData);
return await generator.generate();
},
LayerElementsCompositeLoader: async (commandParams) => {
let loader = new LayerElementsCompositeLoader(commandParams);
await loader.load();
let generator = new RandomMapGenerator();
await generator.fromElementsProvider(loader.mapData);
return await generator.generate();
},
MultipleByLoaderGenerator: async (commandParams) => {
let generator = new MultipleByLoaderGenerator({loaderData: commandParams});
await generator.generate();
},
MultipleWithAssociationsByLoaderGenerator: async (commandParams) => {
let generator = new MultipleWithAssociationsByLoaderGenerator({loaderData: commandParams});
await generator.generate();
}
};
let validCommands = {
'players-experience-per-level': (commandParams) => {
let playersExperiencePerLevel = new PlayersExperiencePerLevel(commandParams);
playersExperiencePerLevel.generate();
},
'monsters-experience-per-level': (commandParams) => {
let monstersExperiencePerLevel = new MonstersExperiencePerLevel(commandParams);
monstersExperiencePerLevel.generate();
},
'attributes-per-level': (commandParams) => {
let attributesPerLevel = new AttributesPerLevel(commandParams);
attributesPerLevel.generate();
},
'maps': async (commandParams) => {
if(!mapsGenerateModes[commandParams.importMode]){
console.error('- Invalid import mode. Valid options: '+Object.keys(mapsGenerateModes).join(', '));
}
let pathParts = commandParams.mapDataFile.split('/');
commandParams.mapDataFile = pathParts.pop();
commandParams.rootFolder = FileHandler.joinPaths(process.cwd(), ...pathParts);
// @TODO - BETA - Fix the generated folder placement.
// this will generate everything under rootFolder/whatever-the-path-is/generated:
await mapsGenerateModes[commandParams.importMode](commandParams);
let generatedFolder = FileHandler.joinPaths(commandParams.rootFolder, 'generated');
// we need to move the generated data to rootFolder/generated:
FileHandler.copyFolderSync(
generatedFolder,
FileHandler.joinPaths(process.cwd(), 'generated')
);
}
};
let args = process.argv;
if(2 === args.length){
console.error('- Missing arguments.', args);
return false;
}
let extractedParams = args.slice(2);
let command = extractedParams[0] || false;
if(!command){
console.error('- Missing command.');
return false;
}
if(-1 === Object.keys(validCommands).indexOf(command)){
console.error('- Invalid command.', command);
return false;
}
let importJson = 'monsters-experience-per-level' === command
|| 'players-experience-per-level' === command
|| 'attributes-per-level' === command;
if(importJson){
let filePath = FileHandler.joinPaths(process.cwd(), extractedParams[1] || '');
if(!filePath){
Logger.error('Invalid data file path.', process.cwd(), filePath);
return false;
}
let importedJson = FileHandler.fetchFileJson(filePath);
if(!importedJson){
console.error('- Can not parse data file.');
return false;
}
if('monsters-experience-per-level' === command){
let secondaryFilePath = FileHandler.joinPaths(process.cwd(), extractedParams[2] || '');
if(!secondaryFilePath){
Logger.error('Invalid data file path.', process.cwd(), secondaryFilePath);
return false;
}
let importedPlayerLevelsJson = FileHandler.fetchFileJson(secondaryFilePath);
if(!importedPlayerLevelsJson){
console.error('- Can not parse data file for player levels.');
return false;
}
importedJson.levelsExperienceByKey = importedPlayerLevelsJson;
}
return validCommands[command](importedJson);
}
if('maps' === command){
return validCommands[command]({
mapDataFile: extractedParams[1],
importMode: extractedParams[2] || ''
});
}
================================================
FILE: bin/import.js
================================================
#! /usr/bin/env node
const { ServerManager } = require('../server');
const { ObjectsImporter } = require('../lib/import/server/objects-importer');
const { PlayersExperiencePerLevelImporter } = require('../lib/import/server/players-experience-per-level-importer');
const { AttributesPerLevelImporter } = require('../lib/import/server/attributes-per-level-importer');
const { ClassPathsImporter } = require('../lib/import/server/class-paths-importer');
const { MapsImporter } = require('../lib/import/server/maps-importer');
const { SkillsImporter } = require('../lib/import/server/skills-importer');
const { FileHandler } = require('@reldens/server-utils');
/**
*
* Commands:
*
* $ npx reldens-import objects custom-game-theme-test generate-data/objects-generate-data.json
*
* - Player experience per-level import is not required if class-paths importer is going to be used.
* $ npx reldens-import players-experience-per-level custom-game-theme-test generate-data/players-experience-per-level.json
*
* - Class-paths importer will also import the experience per level.
* $ npx reldens-import class-paths custom-game-theme-test generate-data/class-paths.json
*
* $ npx reldens-import attributes-per-level custom-game-theme-test generate-data/class-paths-attributes-per-level.json
*
* $ npx reldens-import maps custom-game-theme-test generate-data/maps.json
*
* $ npx reldens-import skills custom-game-theme-test generate-data/skills-data.json
*
*/
let validCommands = {
'objects': async (data, projectThemeName) => {
let serverManager = await initializeServer(data, projectThemeName);
if(!serverManager){
return false;
}
let importer = new ObjectsImporter(serverManager);
await importer.import(data);
},
'players-experience-per-level': async (data, projectThemeName) => {
let serverManager = await initializeServer(data, projectThemeName);
if(!serverManager){
return false;
}
let importer = new PlayersExperiencePerLevelImporter(serverManager);
await importer.import(data);
},
'attributes-per-level': async (data, projectThemeName) => {
let serverManager = await initializeServer(data, projectThemeName);
if(!serverManager){
return false;
}
let importer = new AttributesPerLevelImporter(serverManager);
await importer.import(data);
},
'class-paths': async (data, projectThemeName) => {
let serverManager = await initializeServer(data, projectThemeName);
if(!serverManager){
return false;
}
let importer = new ClassPathsImporter(serverManager);
await importer.import(data);
},
'maps': async (data, projectThemeName) => {
let serverManager = await initializeServer(data, projectThemeName);
if(!serverManager){
return false;
}
let importer = new MapsImporter(serverManager);
await importer.import(data);
},
'skills': async (data, projectThemeName) => {
let serverManager = await initializeServer(data, projectThemeName);
if(!serverManager){
return false;
}
let importer = new SkillsImporter(serverManager);
await importer.import(data);
}
};
async function initializeServer(data, projectThemeName)
{
if (!data) {
console.error('- Missing data.', data);
return false;
}
let appServer = new ServerManager({
projectRoot: process.cwd(),
projectThemeName
});
await appServer.initializeStorage(appServer.rawConfig, appServer.dataServerDriver);
return appServer;
}
let args = process.argv;
if(2 === args.length){
console.error('- Missing arguments.', args);
return false;
}
let extractedParams = args.slice(2);
let command = extractedParams[0] || false;
if (!command) {
console.error('- Missing command.');
return false;
}
let themeName = extractedParams[1] || '';
if (!themeName) {
console.error('- Missing active theme name.');
return false;
}
if (-1 === Object.keys(validCommands).indexOf(command)) {
console.error('- Invalid command.', command);
return false;
}
validCommands[command](FileHandler.fetchFileJson(extractedParams[2] || ''), themeName).then(() => {
console.log('Done.');
process.exit();
}).catch((error) => {
console.error(error);
process.exit();
});
================================================
FILE: bin/install-test.js
================================================
#! /usr/bin/env node
/**
*
* Reldens - Install Test
*
*/
const commander = require('./commander');
commander.projectThemeName = 'custom-game-theme-test';
commander.themeManager.setupPaths(commander);
async function runCommander(commander) {
await commander.themeManager.installSkeleton();
process.exit();
}
runCommander(commander);
================================================
FILE: bin/reldens-commands.js
================================================
#! /usr/bin/env node
/**
*
* Reldens - Commands
*
*/
const commander = require('./commander');
if(commander.prepareCommand()){
-1 !== commander.availableCommands.indexOf(commander.command)
? commander[commander.command]()
: commander.execute().then(() => { console.info('- End'); });
}
================================================
FILE: client.js
================================================
/**
*
* Reldens - GameManager
*
*/
// transpile and polyfill:
require('core-js/stable');
require('regenerator-runtime/runtime');
const { GameManager } = require('./lib/game/client/game-manager');
module.exports.GameManager = GameManager;
================================================
FILE: generated-entities/entities/ads-banner-entity.js
================================================
/**
*
* Reldens - AdsBannerEntity
*
*/
const { EntityProperties } = require('@reldens/storage');
class AdsBannerEntity extends EntityProperties
{
static propertiesConfig(extraProps)
{
let properties = {
id: {
isId: true,
type: 'number',
isRequired: true,
dbType: 'int'
},
ads_id: {
type: 'reference',
reference: 'ads',
isRequired: true,
dbType: 'int'
},
banner_data: {
type: 'textarea',
isRequired: true,
dbType: 'text'
}
};
let propertiesKeys = Object.keys(properties);
let showProperties = propertiesKeys;
let editProperties = [...propertiesKeys];
editProperties.splice(editProperties.indexOf('id'), 1);
let listProperties = [...propertiesKeys];
listProperties.splice(listProperties.indexOf('banner_data'), 1);
return {
showProperties,
editProperties,
listProperties,
filterProperties: listProperties,
properties,
...extraProps
};
}
}
module.exports.AdsBannerEntity = AdsBannerEntity;
================================================
FILE: generated-entities/entities/ads-entity.js
================================================
/**
*
* Reldens - AdsEntity
*
*/
const { EntityProperties } = require('@reldens/storage');
const { sc } = require('@reldens/utils');
class AdsEntity extends EntityProperties
{
static propertiesConfig(extraProps)
{
let titleProperty = 'key';
let properties = {
id: {
isId: true,
type: 'number',
isRequired: true,
dbType: 'int'
},
[titleProperty]: {
isRequired: true,
dbType: 'varchar'
},
provider_id: {
type: 'reference',
reference: 'ads_providers',
isRequired: true,
dbType: 'int'
},
type_id: {
type: 'reference',
reference: 'ads_types',
isRequired: true,
dbType: 'int'
},
gitextract__red38cn/
├── .claude/
│ ├── client-camera-follow-system.md
│ ├── commands-reference.md
│ ├── entities-reference.md
│ ├── environment-variables.md
│ ├── feature-modules.md
│ ├── guest-system-technical-guide.md
│ ├── installer-guide.md
│ ├── items-system-implementation.md
│ ├── player-state-flow.md
│ ├── room-data-optimization.md
│ ├── room-images-tileset-override-flow.md
│ ├── stat-bars-configuration.md
│ ├── storage-architecture.md
│ ├── trade-system-implementation.md
│ └── ui-visibility-configuration.md
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ └── codeql.yml
├── .gitignore
├── CLAUDE.md
├── LICENSE
├── README.md
├── bin/
│ ├── commander.js
│ ├── generate.js
│ ├── import.js
│ ├── install-test.js
│ └── reldens-commands.js
├── client.js
├── generated-entities/
│ ├── entities/
│ │ ├── ads-banner-entity.js
│ │ ├── ads-entity.js
│ │ ├── ads-event-video-entity.js
│ │ ├── ads-played-entity.js
│ │ ├── ads-providers-entity.js
│ │ ├── ads-types-entity.js
│ │ ├── audio-categories-entity.js
│ │ ├── audio-entity.js
│ │ ├── audio-markers-entity.js
│ │ ├── audio-player-config-entity.js
│ │ ├── chat-entity.js
│ │ ├── chat-message-types-entity.js
│ │ ├── clan-entity.js
│ │ ├── clan-levels-entity.js
│ │ ├── clan-levels-modifiers-entity.js
│ │ ├── clan-members-entity.js
│ │ ├── config-entity.js
│ │ ├── config-types-entity.js
│ │ ├── drops-animations-entity.js
│ │ ├── features-entity.js
│ │ ├── items-group-entity.js
│ │ ├── items-inventory-entity.js
│ │ ├── items-item-entity.js
│ │ ├── items-item-modifiers-entity.js
│ │ ├── items-types-entity.js
│ │ ├── locale-entity.js
│ │ ├── objects-animations-entity.js
│ │ ├── objects-assets-entity.js
│ │ ├── objects-entity.js
│ │ ├── objects-items-inventory-entity.js
│ │ ├── objects-items-requirements-entity.js
│ │ ├── objects-items-rewards-entity.js
│ │ ├── objects-skills-entity.js
│ │ ├── objects-stats-entity.js
│ │ ├── objects-types-entity.js
│ │ ├── operation-types-entity.js
│ │ ├── players-entity.js
│ │ ├── players-state-entity.js
│ │ ├── players-stats-entity.js
│ │ ├── respawn-entity.js
│ │ ├── rewards-entity.js
│ │ ├── rewards-events-entity.js
│ │ ├── rewards-events-state-entity.js
│ │ ├── rewards-modifiers-entity.js
│ │ ├── rooms-change-points-entity.js
│ │ ├── rooms-entity.js
│ │ ├── rooms-return-points-entity.js
│ │ ├── scores-detail-entity.js
│ │ ├── scores-entity.js
│ │ ├── skills-class-level-up-animations-entity.js
│ │ ├── skills-class-path-entity.js
│ │ ├── skills-class-path-level-labels-entity.js
│ │ ├── skills-class-path-level-skills-entity.js
│ │ ├── skills-groups-entity.js
│ │ ├── skills-levels-entity.js
│ │ ├── skills-levels-modifiers-conditions-entity.js
│ │ ├── skills-levels-modifiers-entity.js
│ │ ├── skills-levels-set-entity.js
│ │ ├── skills-owners-class-path-entity.js
│ │ ├── skills-skill-animations-entity.js
│ │ ├── skills-skill-attack-entity.js
│ │ ├── skills-skill-entity.js
│ │ ├── skills-skill-group-relation-entity.js
│ │ ├── skills-skill-owner-conditions-entity.js
│ │ ├── skills-skill-owner-effects-conditions-entity.js
│ │ ├── skills-skill-owner-effects-entity.js
│ │ ├── skills-skill-physical-data-entity.js
│ │ ├── skills-skill-target-effects-conditions-entity.js
│ │ ├── skills-skill-target-effects-entity.js
│ │ ├── skills-skill-type-entity.js
│ │ ├── snippets-entity.js
│ │ ├── stats-entity.js
│ │ ├── target-options-entity.js
│ │ ├── users-entity.js
│ │ ├── users-locale-entity.js
│ │ └── users-login-entity.js
│ ├── entities-config.js
│ ├── entities-translations.js
│ └── models/
│ ├── mikro-orm/
│ │ ├── ads-banner-model.js
│ │ ├── ads-event-video-model.js
│ │ ├── ads-model.js
│ │ ├── ads-played-model.js
│ │ ├── ads-providers-model.js
│ │ ├── ads-types-model.js
│ │ ├── audio-categories-model.js
│ │ ├── audio-markers-model.js
│ │ ├── audio-model.js
│ │ ├── audio-player-config-model.js
│ │ ├── chat-message-types-model.js
│ │ ├── chat-model.js
│ │ ├── clan-levels-model.js
│ │ ├── clan-levels-modifiers-model.js
│ │ ├── clan-members-model.js
│ │ ├── clan-model.js
│ │ ├── config-model.js
│ │ ├── config-types-model.js
│ │ ├── drops-animations-model.js
│ │ ├── features-model.js
│ │ ├── items-group-model.js
│ │ ├── items-inventory-model.js
│ │ ├── items-item-model.js
│ │ ├── items-item-modifiers-model.js
│ │ ├── items-types-model.js
│ │ ├── locale-model.js
│ │ ├── objects-animations-model.js
│ │ ├── objects-assets-model.js
│ │ ├── objects-items-inventory-model.js
│ │ ├── objects-items-requirements-model.js
│ │ ├── objects-items-rewards-model.js
│ │ ├── objects-model.js
│ │ ├── objects-skills-model.js
│ │ ├── objects-stats-model.js
│ │ ├── objects-types-model.js
│ │ ├── operation-types-model.js
│ │ ├── players-model.js
│ │ ├── players-state-model.js
│ │ ├── players-stats-model.js
│ │ ├── registered-models-mikro-orm.js
│ │ ├── respawn-model.js
│ │ ├── rewards-events-model.js
│ │ ├── rewards-events-state-model.js
│ │ ├── rewards-model.js
│ │ ├── rewards-modifiers-model.js
│ │ ├── rooms-change-points-model.js
│ │ ├── rooms-model.js
│ │ ├── rooms-return-points-model.js
│ │ ├── scores-detail-model.js
│ │ ├── scores-model.js
│ │ ├── skills-class-level-up-animations-model.js
│ │ ├── skills-class-path-level-labels-model.js
│ │ ├── skills-class-path-level-skills-model.js
│ │ ├── skills-class-path-model.js
│ │ ├── skills-groups-model.js
│ │ ├── skills-levels-model.js
│ │ ├── skills-levels-modifiers-conditions-model.js
│ │ ├── skills-levels-modifiers-model.js
│ │ ├── skills-levels-set-model.js
│ │ ├── skills-owners-class-path-model.js
│ │ ├── skills-skill-animations-model.js
│ │ ├── skills-skill-attack-model.js
│ │ ├── skills-skill-group-relation-model.js
│ │ ├── skills-skill-model.js
│ │ ├── skills-skill-owner-conditions-model.js
│ │ ├── skills-skill-owner-effects-conditions-model.js
│ │ ├── skills-skill-owner-effects-model.js
│ │ ├── skills-skill-physical-data-model.js
│ │ ├── skills-skill-target-effects-conditions-model.js
│ │ ├── skills-skill-target-effects-model.js
│ │ ├── skills-skill-type-model.js
│ │ ├── snippets-model.js
│ │ ├── stats-model.js
│ │ ├── target-options-model.js
│ │ ├── users-locale-model.js
│ │ ├── users-login-model.js
│ │ └── users-model.js
│ ├── objection-js/
│ │ ├── ads-banner-model.js
│ │ ├── ads-event-video-model.js
│ │ ├── ads-model.js
│ │ ├── ads-played-model.js
│ │ ├── ads-providers-model.js
│ │ ├── ads-types-model.js
│ │ ├── audio-categories-model.js
│ │ ├── audio-markers-model.js
│ │ ├── audio-model.js
│ │ ├── audio-player-config-model.js
│ │ ├── chat-message-types-model.js
│ │ ├── chat-model.js
│ │ ├── clan-levels-model.js
│ │ ├── clan-levels-modifiers-model.js
│ │ ├── clan-members-model.js
│ │ ├── clan-model.js
│ │ ├── config-model.js
│ │ ├── config-types-model.js
│ │ ├── drops-animations-model.js
│ │ ├── features-model.js
│ │ ├── items-group-model.js
│ │ ├── items-inventory-model.js
│ │ ├── items-item-model.js
│ │ ├── items-item-modifiers-model.js
│ │ ├── items-types-model.js
│ │ ├── locale-model.js
│ │ ├── objects-animations-model.js
│ │ ├── objects-assets-model.js
│ │ ├── objects-items-inventory-model.js
│ │ ├── objects-items-requirements-model.js
│ │ ├── objects-items-rewards-model.js
│ │ ├── objects-model.js
│ │ ├── objects-skills-model.js
│ │ ├── objects-stats-model.js
│ │ ├── objects-types-model.js
│ │ ├── operation-types-model.js
│ │ ├── players-model.js
│ │ ├── players-state-model.js
│ │ ├── players-stats-model.js
│ │ ├── registered-models-objection-js.js
│ │ ├── respawn-model.js
│ │ ├── rewards-events-model.js
│ │ ├── rewards-events-state-model.js
│ │ ├── rewards-model.js
│ │ ├── rewards-modifiers-model.js
│ │ ├── rooms-change-points-model.js
│ │ ├── rooms-model.js
│ │ ├── rooms-return-points-model.js
│ │ ├── scores-detail-model.js
│ │ ├── scores-model.js
│ │ ├── skills-class-level-up-animations-model.js
│ │ ├── skills-class-path-level-labels-model.js
│ │ ├── skills-class-path-level-skills-model.js
│ │ ├── skills-class-path-model.js
│ │ ├── skills-groups-model.js
│ │ ├── skills-levels-model.js
│ │ ├── skills-levels-modifiers-conditions-model.js
│ │ ├── skills-levels-modifiers-model.js
│ │ ├── skills-levels-set-model.js
│ │ ├── skills-owners-class-path-model.js
│ │ ├── skills-skill-animations-model.js
│ │ ├── skills-skill-attack-model.js
│ │ ├── skills-skill-group-relation-model.js
│ │ ├── skills-skill-model.js
│ │ ├── skills-skill-owner-conditions-model.js
│ │ ├── skills-skill-owner-effects-conditions-model.js
│ │ ├── skills-skill-owner-effects-model.js
│ │ ├── skills-skill-physical-data-model.js
│ │ ├── skills-skill-target-effects-conditions-model.js
│ │ ├── skills-skill-target-effects-model.js
│ │ ├── skills-skill-type-model.js
│ │ ├── snippets-model.js
│ │ ├── stats-model.js
│ │ ├── target-options-model.js
│ │ ├── users-locale-model.js
│ │ ├── users-login-model.js
│ │ └── users-model.js
│ └── prisma/
│ ├── ads-banner-model.js
│ ├── ads-event-video-model.js
│ ├── ads-model.js
│ ├── ads-played-model.js
│ ├── ads-providers-model.js
│ ├── ads-types-model.js
│ ├── audio-categories-model.js
│ ├── audio-markers-model.js
│ ├── audio-model.js
│ ├── audio-player-config-model.js
│ ├── chat-message-types-model.js
│ ├── chat-model.js
│ ├── clan-levels-model.js
│ ├── clan-levels-modifiers-model.js
│ ├── clan-members-model.js
│ ├── clan-model.js
│ ├── config-model.js
│ ├── config-types-model.js
│ ├── drops-animations-model.js
│ ├── features-model.js
│ ├── items-group-model.js
│ ├── items-inventory-model.js
│ ├── items-item-model.js
│ ├── items-item-modifiers-model.js
│ ├── items-types-model.js
│ ├── locale-model.js
│ ├── objects-animations-model.js
│ ├── objects-assets-model.js
│ ├── objects-items-inventory-model.js
│ ├── objects-items-requirements-model.js
│ ├── objects-items-rewards-model.js
│ ├── objects-model.js
│ ├── objects-skills-model.js
│ ├── objects-stats-model.js
│ ├── objects-types-model.js
│ ├── operation-types-model.js
│ ├── players-model.js
│ ├── players-state-model.js
│ ├── players-stats-model.js
│ ├── registered-models-prisma.js
│ ├── respawn-model.js
│ ├── rewards-events-model.js
│ ├── rewards-events-state-model.js
│ ├── rewards-model.js
│ ├── rewards-modifiers-model.js
│ ├── rooms-change-points-model.js
│ ├── rooms-model.js
│ ├── rooms-return-points-model.js
│ ├── scores-detail-model.js
│ ├── scores-model.js
│ ├── skills-class-level-up-animations-model.js
│ ├── skills-class-path-level-labels-model.js
│ ├── skills-class-path-level-skills-model.js
│ ├── skills-class-path-model.js
│ ├── skills-groups-model.js
│ ├── skills-levels-model.js
│ ├── skills-levels-modifiers-conditions-model.js
│ ├── skills-levels-modifiers-model.js
│ ├── skills-levels-set-model.js
│ ├── skills-owners-class-path-model.js
│ ├── skills-skill-animations-model.js
│ ├── skills-skill-attack-model.js
│ ├── skills-skill-group-relation-model.js
│ ├── skills-skill-model.js
│ ├── skills-skill-owner-conditions-model.js
│ ├── skills-skill-owner-effects-conditions-model.js
│ ├── skills-skill-owner-effects-model.js
│ ├── skills-skill-physical-data-model.js
│ ├── skills-skill-target-effects-conditions-model.js
│ ├── skills-skill-target-effects-model.js
│ ├── skills-skill-type-model.js
│ ├── snippets-model.js
│ ├── stats-model.js
│ ├── target-options-model.js
│ ├── users-locale-model.js
│ ├── users-login-model.js
│ └── users-model.js
├── install/
│ ├── css/
│ │ └── styles.scss
│ ├── index.html
│ ├── index.js
│ └── site.webmanifest
├── lib/
│ ├── actions/
│ │ ├── client/
│ │ │ ├── game-manager-enricher.js
│ │ │ ├── messages-guard.js
│ │ │ ├── messages-handler.js
│ │ │ ├── player-selector.js
│ │ │ ├── plugin.js
│ │ │ ├── preloader-handler.js
│ │ │ ├── receiver-wrapper.js
│ │ │ ├── skills-ui.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ ├── factories/
│ │ │ ├── class-path-key-factory.js
│ │ │ └── skill-data-factory.js
│ │ ├── schemas/
│ │ │ └── skill-schema.js
│ │ └── server/
│ │ ├── battle-end-action.js
│ │ ├── battle.js
│ │ ├── data-loader.js
│ │ ├── entities/
│ │ │ ├── operation-types-entity-override.js
│ │ │ ├── skills-class-path-entity-override.js
│ │ │ ├── skills-levels-modifiers-entity-override.js
│ │ │ ├── skills-levels-set-entity-override.js
│ │ │ ├── skills-owners-class-path-entity-override.js
│ │ │ ├── skills-skill-animations-entity-override.js
│ │ │ ├── skills-skill-attack-entity-override.js
│ │ │ ├── skills-skill-entity-override.js
│ │ │ ├── skills-skill-owner-effects-entity-override.js
│ │ │ └── skills-skill-target-effects-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── event-listeners.js
│ │ ├── events/
│ │ │ ├── battle-ended-event.js
│ │ │ └── player-death-event.js
│ │ ├── initial-game-data-enricher.js
│ │ ├── message-actions.js
│ │ ├── models-manager.js
│ │ ├── player-class-path-handler.js
│ │ ├── player-enricher.js
│ │ ├── plugin.js
│ │ ├── pve.js
│ │ ├── pvp.js
│ │ ├── skills/
│ │ │ ├── type-attack.js
│ │ │ ├── type-effect.js
│ │ │ ├── type-physical-attack.js
│ │ │ ├── type-physical-effect.js
│ │ │ └── types.js
│ │ ├── skills-class-path-loader.js
│ │ ├── skills-extra-data-mapper.js
│ │ ├── storage/
│ │ │ ├── class-path-generator.js
│ │ │ ├── conditions-generator.js
│ │ │ ├── levels-generator.js
│ │ │ ├── modifiers-generator.js
│ │ │ └── skills-generator.js
│ │ └── storage-observer.js
│ ├── admin/
│ │ └── server/
│ │ ├── entities-config-override.js
│ │ ├── plugin.js
│ │ ├── room-map-tilesets-validator.js
│ │ ├── rooms-file-upload-renderer.js
│ │ ├── subscribers/
│ │ │ ├── create-admin-subscriber.js
│ │ │ ├── generators-routes-subscriber.js
│ │ │ ├── maps-wizard-subscriber.js
│ │ │ ├── objects-importer-subscriber.js
│ │ │ ├── rooms-entity-subscriber.js
│ │ │ ├── shutdown-subscriber.js
│ │ │ ├── skills-importer-subscriber.js
│ │ │ └── theme-manager-subscriber.js
│ │ └── templates-list.js
│ ├── ads/
│ │ ├── client/
│ │ │ ├── ads-provider.js
│ │ │ ├── messages-listener.js
│ │ │ ├── plugin.js
│ │ │ ├── providers/
│ │ │ │ ├── crazy-games/
│ │ │ │ │ ├── banners-handler.js
│ │ │ │ │ ├── validator.js
│ │ │ │ │ └── videos-handler.js
│ │ │ │ ├── crazy-games.js
│ │ │ │ ├── game-monetize.js
│ │ │ │ └── google-ad-sense.js
│ │ │ ├── providers-list.js
│ │ │ ├── sdk-handler.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── ads-start-handler.js
│ │ ├── ads-type/
│ │ │ ├── banner.js
│ │ │ ├── base-ad.js
│ │ │ └── event-video.js
│ │ ├── entities/
│ │ │ └── ads-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── event-handlers/
│ │ │ └── create-player-ads-handler.js
│ │ ├── message-actions.js
│ │ └── plugin.js
│ ├── audio/
│ │ ├── client/
│ │ │ ├── audio-ui.js
│ │ │ ├── audio-update.js
│ │ │ ├── manager.js
│ │ │ ├── messages-listener.js
│ │ │ ├── plugin.js
│ │ │ ├── scene-audio-player.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── audio-hot-plug-callbacks.js
│ │ ├── entities/
│ │ │ └── audio-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── manager.js
│ │ └── plugin.js
│ ├── bundlers/
│ │ └── drivers/
│ │ └── parcel-config.json
│ ├── chat/
│ │ ├── cleaner.js
│ │ ├── client/
│ │ │ ├── chat-tabs.js
│ │ │ ├── chat-ui.js
│ │ │ ├── messages-listener.js
│ │ │ ├── plugin.js
│ │ │ ├── snippets/
│ │ │ │ └── en_US.js
│ │ │ └── templates-handler.js
│ │ ├── constants.js
│ │ ├── message-factory.js
│ │ └── server/
│ │ ├── entities/
│ │ │ ├── chat-entity-override.js
│ │ │ └── chat-message-types-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── event-listener/
│ │ │ ├── guest-invalid-change-point.js
│ │ │ ├── npc-skills.js
│ │ │ └── player-skills.js
│ │ ├── manager.js
│ │ ├── message-actions.js
│ │ ├── messages/
│ │ │ ├── message-data-mapper.js
│ │ │ ├── npc-damage-callback.js
│ │ │ ├── npc-dodge-callback.js
│ │ │ ├── npc-modifiers-callback.js
│ │ │ ├── player-damage-callback.js
│ │ │ ├── player-dodge-callback.js
│ │ │ ├── player-modifiers-callback.js
│ │ │ └── validator.js
│ │ ├── messages-guard.js
│ │ ├── plugin.js
│ │ └── room-chat.js
│ ├── config/
│ │ ├── client/
│ │ │ └── config-manager.js
│ │ ├── constants.js
│ │ ├── processor.js
│ │ └── server/
│ │ ├── entities/
│ │ │ ├── config-entity-override.js
│ │ │ └── config-types-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ └── manager.js
│ ├── features/
│ │ ├── client/
│ │ │ ├── config-client.js
│ │ │ └── manager.js
│ │ ├── plugin-interface.js
│ │ └── server/
│ │ ├── config-server.js
│ │ ├── entities/
│ │ │ ├── features-entity-override.js
│ │ │ └── features-entity.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── manager.js
│ │ └── setup-server-properties.js
│ ├── firebase/
│ │ ├── client/
│ │ │ └── connector.js
│ │ └── server/
│ │ └── plugin.js
│ ├── game/
│ │ ├── allowed-file-types.js
│ │ ├── client/
│ │ │ ├── animations-defaults-merger.js
│ │ │ ├── communication/
│ │ │ │ ├── room-state-entities-manager.js
│ │ │ │ └── state-callbacks-manager.js
│ │ │ ├── engine/
│ │ │ │ └── sprite-text-factory.js
│ │ │ ├── fps-counter.js
│ │ │ ├── game-client.js
│ │ │ ├── game-dom.js
│ │ │ ├── game-engine.js
│ │ │ ├── game-manager.js
│ │ │ ├── handlers/
│ │ │ │ ├── client-start-handler.js
│ │ │ │ ├── errors-block-handler.js
│ │ │ │ ├── forgot-password-form-handler.js
│ │ │ │ ├── full-screen-handler.js
│ │ │ │ ├── guest-form-handler.js
│ │ │ │ ├── login-form-handler.js
│ │ │ │ ├── registration-form-handler.js
│ │ │ │ └── terms-and-conditions-handler.js
│ │ │ ├── instructions-ui.js
│ │ │ ├── joystick.js
│ │ │ ├── minimap-ui.js
│ │ │ ├── minimap.js
│ │ │ ├── room-events.js
│ │ │ ├── scene-dynamic.js
│ │ │ ├── scene-preloader.js
│ │ │ ├── settings-ui.js
│ │ │ ├── snippets/
│ │ │ │ └── en_US.js
│ │ │ ├── tileset-animation.js
│ │ │ ├── ui-factory.js
│ │ │ └── user-interface.js
│ │ ├── constants.js
│ │ ├── mime-types.js
│ │ ├── properties-handler.js
│ │ ├── reldens-ascii.js
│ │ ├── server/
│ │ │ ├── client-wrapper.js
│ │ │ ├── data-server-config.js
│ │ │ ├── data-server-initializer.js
│ │ │ ├── entities-loader.js
│ │ │ ├── entity-properties.js
│ │ │ ├── forgot-password.js
│ │ │ ├── game-server.js
│ │ │ ├── homepage-loader.js
│ │ │ ├── install-templates/
│ │ │ │ ├── .gitignore.dist
│ │ │ │ ├── data-package.json
│ │ │ │ └── knexfile.js.dist
│ │ │ ├── installer/
│ │ │ │ ├── entities-installation.js
│ │ │ │ ├── generic-driver-installation.js
│ │ │ │ ├── packages-installation.js
│ │ │ │ ├── prisma-installation.js
│ │ │ │ ├── prisma-subprocess-worker.js
│ │ │ │ └── project-files-creation.js
│ │ │ ├── installer.js
│ │ │ ├── login-manager.js
│ │ │ ├── mailer/
│ │ │ │ ├── nodemailer-factory.js
│ │ │ │ └── sendgrid-factory.js
│ │ │ ├── mailer.js
│ │ │ ├── manager.js
│ │ │ ├── maps-loader.js
│ │ │ ├── memory/
│ │ │ │ ├── active-player.js
│ │ │ │ └── active-players.js
│ │ │ ├── storage/
│ │ │ │ └── drivers-map.js
│ │ │ ├── template-engine.js
│ │ │ ├── templates-to-path-mapper.js
│ │ │ └── theme-manager.js
│ │ └── type-determiner.js
│ ├── import/
│ │ └── server/
│ │ ├── attributes-per-level-importer.js
│ │ ├── class-paths-importer.js
│ │ ├── maps-importer.js
│ │ ├── objects-importer.js
│ │ ├── players-experience-per-level-importer.js
│ │ ├── skills-importer.js
│ │ └── tile-extruder.js
│ ├── inventory/
│ │ ├── client/
│ │ │ ├── exchange/
│ │ │ │ └── trade-target-action.js
│ │ │ ├── inventory-receiver.js
│ │ │ ├── inventory-ui.js
│ │ │ ├── plugin.js
│ │ │ ├── snippets/
│ │ │ │ └── en_US.js
│ │ │ ├── templates-handler.js
│ │ │ ├── trade-items-helper.js
│ │ │ ├── trade-message-handler.js
│ │ │ └── trade-message-listener.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── entities/
│ │ │ ├── items-group-entity-override.js
│ │ │ ├── items-inventory-entity-override.js
│ │ │ └── items-item-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── exchange/
│ │ │ ├── player-processor.js
│ │ │ └── processor.js
│ │ ├── group-hot-plug-callbacks.js
│ │ ├── groups-data-remover.js
│ │ ├── items-factory.js
│ │ ├── message-actions.js
│ │ ├── models-manager.js
│ │ ├── plugin.js
│ │ ├── storage-observer.js
│ │ └── subscribers/
│ │ ├── player-death-subscriber.js
│ │ ├── player-subscriber.js
│ │ └── server-subscriber.js
│ ├── objects/
│ │ ├── client/
│ │ │ ├── animation-engine.js
│ │ │ ├── drops-message-listener.js
│ │ │ ├── objects-message-listener.js
│ │ │ ├── plugin.js
│ │ │ ├── snippets/
│ │ │ │ └── en_US.js
│ │ │ └── trader-object-ui.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── entities/
│ │ │ └── objects-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── handler/
│ │ │ └── objects-class-type.js
│ │ ├── manager.js
│ │ ├── object/
│ │ │ ├── object-types-classes.js
│ │ │ ├── object-types.js
│ │ │ └── type/
│ │ │ ├── animation-object.js
│ │ │ ├── base-object.js
│ │ │ ├── drop-object.js
│ │ │ ├── enemy-object.js
│ │ │ ├── multiple-object.js
│ │ │ ├── npc-object.js
│ │ │ └── trader-object.js
│ │ └── plugin.js
│ ├── prediction/
│ │ └── client/
│ │ ├── player-engine-prediction.js
│ │ ├── plugin.js
│ │ ├── prediction-world-creator.js
│ │ └── room-events-override.js
│ ├── respawn/
│ │ └── server/
│ │ ├── entities/
│ │ │ └── respawn-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── plugin.js
│ │ └── room-respawn.js
│ ├── rewards/
│ │ ├── client/
│ │ │ ├── message-handler.js
│ │ │ ├── message-listener.js
│ │ │ ├── messages-processor.js
│ │ │ ├── plugin.js
│ │ │ ├── preloader-handler.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── actions/
│ │ │ └── give-reward-action.js
│ │ ├── add-item-to-inventory.js
│ │ ├── drops-animations.js
│ │ ├── entities/
│ │ │ ├── drops-animations-entity-override.js
│ │ │ ├── rewards-entity-override.js
│ │ │ ├── rewards-events-entity-override.js
│ │ │ └── rewards-modifiers-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── event-handlers/
│ │ │ ├── event-handler.js
│ │ │ └── login-state-handler.js
│ │ ├── mappers/
│ │ │ ├── rewards-events-mapper.js
│ │ │ └── rewards-to-actions-mapper.js
│ │ ├── pick-up-object.js
│ │ ├── plugin.js
│ │ ├── repositories-extension.js
│ │ ├── reward-message-actions.js
│ │ ├── reward.js
│ │ ├── rewards-drops-mapper.js
│ │ ├── rewards-drops-processor.js
│ │ ├── rewards-events-data-sender.js
│ │ ├── rewards-events-handler.js
│ │ ├── rewards-events-message-actions.js
│ │ ├── rewards-events-provider.js
│ │ ├── rewards-events-updater.js
│ │ ├── rewards-mapper.js
│ │ ├── subscribers/
│ │ │ ├── object-subscriber.js
│ │ │ └── rewards-subscriber.js
│ │ ├── target-determiner.js
│ │ ├── validator/
│ │ │ └── reward-drop-validator.js
│ │ └── world-drop-handler.js
│ ├── rooms/
│ │ ├── client/
│ │ │ └── plugin.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── entities/
│ │ │ └── rooms-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── events/
│ │ │ └── joined-scene-room-event.js
│ │ ├── game.js
│ │ ├── login.js
│ │ ├── manager.js
│ │ ├── plugin.js
│ │ ├── random-player-state.js
│ │ ├── scene-data-filter.js
│ │ ├── scene.js
│ │ ├── state.js
│ │ └── world-config.js
│ ├── scores/
│ │ ├── client/
│ │ │ ├── messages-processor.js
│ │ │ ├── plugin.js
│ │ │ ├── preloader-handler.js
│ │ │ ├── scores-message-handler.js
│ │ │ ├── scores-message-listener.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── entities/
│ │ │ ├── scores-detail-entity-override.js
│ │ │ └── scores-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── mapper/
│ │ │ └── increase-score-on-kill-mapper.js
│ │ ├── plugin.js
│ │ ├── repositories-extension.js
│ │ ├── scores-provider.js
│ │ ├── scores-sender.js
│ │ ├── scores-updater.js
│ │ └── subscriber/
│ │ ├── create-scores-route.js
│ │ ├── increase-score-on-kill.js
│ │ └── send-initial-scores-data.js
│ ├── snippets/
│ │ ├── client/
│ │ │ ├── plugin.js
│ │ │ ├── snippets/
│ │ │ │ └── en_US.js
│ │ │ ├── snippets-ui.js
│ │ │ ├── templates-handler.js
│ │ │ └── translations-mapper.js
│ │ ├── constants.js
│ │ ├── server/
│ │ │ ├── configuration-enricher.js
│ │ │ ├── entities/
│ │ │ │ ├── locale-entity-override.js
│ │ │ │ ├── snippets-entity-override.js
│ │ │ │ └── users-locale-entity-override.js
│ │ │ ├── entities-config.js
│ │ │ ├── entities-translations.js
│ │ │ ├── initial-game-data-enricher.js
│ │ │ └── plugin.js
│ │ └── translator.js
│ ├── teams/
│ │ ├── client/
│ │ │ ├── clan-message-handler.js
│ │ │ ├── clan-message-listener.js
│ │ │ ├── messages-processor.js
│ │ │ ├── plugin.js
│ │ │ ├── target-box-enricher.js
│ │ │ ├── team-message-handler.js
│ │ │ ├── team-message-listener.js
│ │ │ └── templates-handler.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── clan-factory.js
│ │ ├── clan-message-actions.js
│ │ ├── clan-updates-handler.js
│ │ ├── clan.js
│ │ ├── entities/
│ │ │ ├── clan-entity-override.js
│ │ │ └── clan-levels-modifiers-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── event-handlers/
│ │ │ ├── create-player-clan-handler.js
│ │ │ ├── create-player-team-handler.js
│ │ │ ├── end-player-hit-change-point-team-handler.js
│ │ │ └── stats-update-handler.js
│ │ ├── message-actions/
│ │ │ ├── chat-message-actions.js
│ │ │ ├── clan-create.js
│ │ │ ├── clan-disconnect.js
│ │ │ ├── clan-join.js
│ │ │ ├── clan-leave.js
│ │ │ ├── team-join.js
│ │ │ ├── team-leave.js
│ │ │ ├── try-clan-invite.js
│ │ │ └── try-team-start.js
│ │ ├── players-data-mapper.js
│ │ ├── plugin.js
│ │ ├── team-message-actions.js
│ │ ├── team-updates-handler.js
│ │ └── team.js
│ ├── users/
│ │ ├── client/
│ │ │ ├── bar-properties.js
│ │ │ ├── lifebar-ui.js
│ │ │ ├── objects-handler.js
│ │ │ ├── player-engine.js
│ │ │ ├── player-stats-bars-ui.js
│ │ │ ├── player-stats-ui.js
│ │ │ ├── plugin.js
│ │ │ └── snippets/
│ │ │ └── en_US.js
│ │ ├── constants.js
│ │ └── server/
│ │ ├── create-admin.js
│ │ ├── entities/
│ │ │ ├── players-entity-override.js
│ │ │ ├── players-state-entity-override.js
│ │ │ ├── players-stats-entity-override.js
│ │ │ ├── stats-entity-override.js
│ │ │ ├── users-entity-override.js
│ │ │ └── users-login-entity-override.js
│ │ ├── entities-config.js
│ │ ├── entities-translations.js
│ │ ├── manager.js
│ │ ├── player.js
│ │ ├── plugin.js
│ │ └── reset-password.js
│ └── world/
│ ├── client/
│ │ ├── debug-world-creator.js
│ │ ├── plugin.js
│ │ └── renderer.js
│ ├── constants.js
│ ├── server/
│ │ ├── body-state.js
│ │ ├── collisions-manager.js
│ │ ├── object-body-state.js
│ │ ├── p2world.js
│ │ ├── path-finder.js
│ │ ├── physical-body.js
│ │ └── world-walkable-nodes-around-provider.js
│ ├── world-points-validator.js
│ ├── world-position-calculator.js
│ └── world-timer.js
├── migrations/
│ ├── development/
│ │ ├── 20190923183906_v4.0.0.js
│ │ ├── beta.09-sql-update.sql
│ │ ├── beta.12-sql-update.sql
│ │ ├── beta.15-sql-update.sql
│ │ ├── beta.16-sql-update.sql
│ │ ├── beta.16.5-sql-update.sql
│ │ ├── beta.17-sql-update.sql
│ │ ├── beta.18-sql-update.sql
│ │ ├── beta.18.1-sql-update.sql
│ │ ├── beta.19-sql-update.sql
│ │ ├── beta.20-sql-update.sql
│ │ ├── beta.21-sql-update.sql
│ │ ├── beta.22-sql-update.sql
│ │ ├── beta.23-sql-update.sql
│ │ ├── beta.24-sql-update.sql
│ │ ├── beta.24.1-sql-update.sql
│ │ ├── beta.25-sql-update.sql
│ │ ├── beta.26-sql-update.sql
│ │ ├── beta.27-sql-update.sql
│ │ ├── beta.28-sql-update.sql
│ │ ├── beta.30-sql-update.sql
│ │ ├── beta.31-sql-update.sql
│ │ ├── beta.34-sql-update.sql
│ │ ├── beta.35-sql-update.sql
│ │ ├── beta.36-sql-update.sql
│ │ ├── beta.38-sql-update.sql
│ │ ├── beta.38.3-sql-update.sql
│ │ ├── beta.39-sql-update.sql
│ │ ├── beta.39.7-sql-update.sql
│ │ ├── beta.39.8-sql-update.sql
│ │ └── reldens-test-sample-data-v4.0.0.sql
│ └── production/
│ ├── 20190923181825_v4.0.0.js
│ ├── mongo-db-install.js
│ ├── reldens-basic-config-v4.0.0.sql
│ ├── reldens-install-v4.0.0.sql
│ └── reldens-sample-data-v4.0.0.sql
├── package.json
├── server.js
├── tests/
│ ├── base-test.js
│ ├── database-reset-utility.js
│ ├── fixtures/
│ │ ├── crud-test-data.js
│ │ ├── entities-list.js
│ │ ├── features-test-data.js
│ │ ├── generate-complete-comparison.js
│ │ ├── generate-entities-fixtures.js
│ │ └── test-file.json
│ ├── manager.js
│ ├── run.js
│ ├── test-admin-auth.js
│ ├── test-admin-crud.js
│ ├── test-admin-features.js
│ └── utils.js
└── theme/
├── admin/
│ ├── functions.js
│ ├── reldens-admin-client.css
│ ├── reldens-admin-client.js
│ ├── reldens-functions.js
│ └── templates/
│ ├── cache-clean-button.html
│ ├── clear-all-cache-button.html
│ ├── dashboard.html
│ ├── default-copyright.html
│ ├── edit.html
│ ├── fields/
│ │ ├── edit/
│ │ │ ├── button.html
│ │ │ ├── checkbox.html
│ │ │ ├── file.html
│ │ │ ├── radio.html
│ │ │ ├── select.html
│ │ │ ├── text.html
│ │ │ ├── textarea.html
│ │ │ ├── tileset-alert-wrapper.html
│ │ │ └── tileset-file-item.html
│ │ └── view/
│ │ ├── audio.html
│ │ ├── audios.html
│ │ ├── boolean.html
│ │ ├── image.html
│ │ ├── images.html
│ │ ├── link.html
│ │ ├── links.html
│ │ ├── text.html
│ │ └── textarea.html
│ ├── layout.html
│ ├── list-content.html
│ ├── list.html
│ ├── login.html
│ ├── management.html
│ ├── maps-wizard-maps-selection.html
│ ├── maps-wizard.html
│ ├── objects-import.html
│ ├── pagination-link.html
│ ├── sections/
│ │ ├── editForm/
│ │ │ └── cms-pages.html
│ │ ├── view/
│ │ │ └── rooms.html
│ │ └── viewForm/
│ │ └── cms-pages.html
│ ├── sidebar-header.html
│ ├── sidebar-item.html
│ ├── sidebar.html
│ ├── skills-import.html
│ ├── theme-manager.html
│ └── view.html
├── default/
│ ├── assets/
│ │ ├── email/
│ │ │ ├── forgot.html
│ │ │ ├── reset-error.html
│ │ │ └── reset-success.html
│ │ ├── features/
│ │ │ ├── chat/
│ │ │ │ └── templates/
│ │ │ │ ├── message.html
│ │ │ │ ├── tab-content.html
│ │ │ │ ├── tab-label.html
│ │ │ │ ├── tabs-container.html
│ │ │ │ └── ui-chat.html
│ │ │ ├── inventory/
│ │ │ │ └── templates/
│ │ │ │ ├── equip.html
│ │ │ │ ├── group.html
│ │ │ │ ├── item.html
│ │ │ │ ├── trade-accept.html
│ │ │ │ ├── trade-action-remove.html
│ │ │ │ ├── trade-action.html
│ │ │ │ ├── trade-container.html
│ │ │ │ ├── trade-item-quantity.html
│ │ │ │ ├── trade-item.html
│ │ │ │ ├── trade-player-container.html
│ │ │ │ ├── trade-requirements.html
│ │ │ │ ├── trade-rewards.html
│ │ │ │ ├── trade-start.html
│ │ │ │ ├── ui-equipment.html
│ │ │ │ ├── ui-inventory.html
│ │ │ │ └── usable.html
│ │ │ ├── rewards/
│ │ │ │ └── templates/
│ │ │ │ ├── ui-rewards-list.html
│ │ │ │ └── ui-rewards.html
│ │ │ ├── scores/
│ │ │ │ └── templates/
│ │ │ │ ├── ui-scores-table.html
│ │ │ │ └── ui-scores.html
│ │ │ ├── skills/
│ │ │ │ └── templates/
│ │ │ │ ├── ui-class-path.html
│ │ │ │ ├── ui-experience.html
│ │ │ │ ├── ui-level.html
│ │ │ │ ├── ui-skill-box.html
│ │ │ │ └── ui-skills.html
│ │ │ ├── snippets/
│ │ │ │ └── templates/
│ │ │ │ └── ui-snippets.html
│ │ │ └── teams/
│ │ │ └── templates/
│ │ │ ├── clan-accept.html
│ │ │ ├── clan-container.html
│ │ │ ├── clan-create.html
│ │ │ ├── clan-invite.html
│ │ │ ├── clan-member-data.html
│ │ │ ├── clan-player-data.html
│ │ │ ├── clan-remove.html
│ │ │ ├── shared-property.html
│ │ │ ├── team-accept.html
│ │ │ ├── team-container.html
│ │ │ ├── team-invite.html
│ │ │ ├── team-player-data.html
│ │ │ ├── team-remove.html
│ │ │ ├── ui-clan.html
│ │ │ └── ui-teams.html
│ │ ├── html/
│ │ │ ├── dialog-box.html
│ │ │ ├── layout.html
│ │ │ ├── player-stat.html
│ │ │ ├── player-stats-bar.html
│ │ │ ├── ui-action-box.html
│ │ │ ├── ui-audio-category-row.html
│ │ │ ├── ui-audio.html
│ │ │ ├── ui-controls.html
│ │ │ ├── ui-full-screen-button.html
│ │ │ ├── ui-instructions.html
│ │ │ ├── ui-loading.html
│ │ │ ├── ui-minimap.html
│ │ │ ├── ui-option-button.html
│ │ │ ├── ui-option-icon.html
│ │ │ ├── ui-options-container.html
│ │ │ ├── ui-player-box.html
│ │ │ ├── ui-player-stats.html
│ │ │ ├── ui-scene-label.html
│ │ │ ├── ui-settings-content.html
│ │ │ ├── ui-settings.html
│ │ │ └── ui-target.html
│ │ └── maps/
│ │ ├── reldens-bots-forest-house-01-n0.json
│ │ ├── reldens-bots-forest.json
│ │ ├── reldens-bots.json
│ │ ├── reldens-forest.json
│ │ ├── reldens-gravity.json
│ │ ├── reldens-house-1-2d-floor.json
│ │ ├── reldens-house-1.json
│ │ ├── reldens-house-2.json
│ │ └── reldens-town.json
│ ├── browserconfig.xml
│ ├── config.js
│ ├── css/
│ │ ├── ads.scss
│ │ ├── base.scss
│ │ ├── chat.scss
│ │ ├── firebase.scss
│ │ ├── game-over.scss
│ │ ├── instructions.scss
│ │ ├── items-system.scss
│ │ ├── joystick.scss
│ │ ├── minimap.scss
│ │ ├── player-selection.scss
│ │ ├── player-stats-bars.scss
│ │ ├── rewards-events.scss
│ │ ├── scores.scss
│ │ ├── settings.scss
│ │ ├── skills.scss
│ │ ├── styles.scss
│ │ ├── teams.scss
│ │ ├── terms-and-conditions.scss
│ │ ├── variables.scss
│ │ └── wooden-ui.scss
│ ├── es-index.html
│ ├── index.html
│ ├── index.js
│ └── site.webmanifest
├── index.js.dist
└── plugins/
├── bot.js
├── client-plugin.js
├── objects/
│ ├── client/
│ │ └── npc1.js
│ └── server/
│ ├── healer.js
│ ├── quest-npc.js
│ └── weapons-master.js
└── server-plugin.js
Showing preview only (318K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3727 symbols across 709 files)
FILE: bin/commander.js
class Commander (line 19) | class Commander
method prepareCommand (line 30) | prepareCommand()
method ensureReldensPackage (line 65) | ensureReldensPackage()
method parseArgs (line 80) | parseArgs()
method validateThemeManagerCommand (line 98) | validateThemeManagerCommand()
method execute (line 110) | async execute()
method test (line 117) | test()
method generateEntities (line 125) | generateEntities()
method createAdmin (line 153) | async createAdmin()
method resetPassword (line 163) | async resetPassword()
method getCommandArgs (line 173) | getCommandArgs(requiredArgs)
method loadEnvironmentConfig (line 194) | loadEnvironmentConfig()
method initializeServerManager (line 204) | async initializeServerManager()
method help (line 216) | help()
FILE: bin/import.js
function initializeServer (line 83) | async function initializeServer(data, projectThemeName)
FILE: bin/install-test.js
function runCommander (line 15) | async function runCommander(commander) {
FILE: generated-entities/entities/ads-banner-entity.js
class AdsBannerEntity (line 9) | class AdsBannerEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/ads-entity.js
class AdsEntity (line 10) | class AdsEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/ads-event-video-entity.js
class AdsEventVideoEntity (line 9) | class AdsEventVideoEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/ads-played-entity.js
class AdsPlayedEntity (line 9) | class AdsPlayedEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/ads-providers-entity.js
class AdsProvidersEntity (line 9) | class AdsProvidersEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/ads-types-entity.js
class AdsTypesEntity (line 9) | class AdsTypesEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/audio-categories-entity.js
class AudioCategoriesEntity (line 10) | class AudioCategoriesEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/audio-entity.js
class AudioEntity (line 10) | class AudioEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/audio-markers-entity.js
class AudioMarkersEntity (line 9) | class AudioMarkersEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/audio-player-config-entity.js
class AudioPlayerConfigEntity (line 9) | class AudioPlayerConfigEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/chat-entity.js
class ChatEntity (line 9) | class ChatEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/chat-message-types-entity.js
class ChatMessageTypesEntity (line 9) | class ChatMessageTypesEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/clan-entity.js
class ClanEntity (line 10) | class ClanEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/clan-levels-entity.js
class ClanLevelsEntity (line 9) | class ClanLevelsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/clan-levels-modifiers-entity.js
class ClanLevelsModifiersEntity (line 9) | class ClanLevelsModifiersEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/clan-members-entity.js
class ClanMembersEntity (line 9) | class ClanMembersEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/config-entity.js
class ConfigEntity (line 9) | class ConfigEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/config-types-entity.js
class ConfigTypesEntity (line 9) | class ConfigTypesEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/drops-animations-entity.js
class DropsAnimationsEntity (line 9) | class DropsAnimationsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/features-entity.js
class FeaturesEntity (line 9) | class FeaturesEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/items-group-entity.js
class ItemsGroupEntity (line 10) | class ItemsGroupEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/items-inventory-entity.js
class ItemsInventoryEntity (line 9) | class ItemsInventoryEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/items-item-entity.js
class ItemsItemEntity (line 10) | class ItemsItemEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/items-item-modifiers-entity.js
class ItemsItemModifiersEntity (line 9) | class ItemsItemModifiersEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/items-types-entity.js
class ItemsTypesEntity (line 9) | class ItemsTypesEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/locale-entity.js
class LocaleEntity (line 9) | class LocaleEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/objects-animations-entity.js
class ObjectsAnimationsEntity (line 9) | class ObjectsAnimationsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/objects-assets-entity.js
class ObjectsAssetsEntity (line 9) | class ObjectsAssetsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/objects-entity.js
class ObjectsEntity (line 10) | class ObjectsEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/objects-items-inventory-entity.js
class ObjectsItemsInventoryEntity (line 9) | class ObjectsItemsInventoryEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/objects-items-requirements-entity.js
class ObjectsItemsRequirementsEntity (line 9) | class ObjectsItemsRequirementsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/objects-items-rewards-entity.js
class ObjectsItemsRewardsEntity (line 9) | class ObjectsItemsRewardsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/objects-skills-entity.js
class ObjectsSkillsEntity (line 9) | class ObjectsSkillsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/objects-stats-entity.js
class ObjectsStatsEntity (line 9) | class ObjectsStatsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/objects-types-entity.js
class ObjectsTypesEntity (line 9) | class ObjectsTypesEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/operation-types-entity.js
class OperationTypesEntity (line 9) | class OperationTypesEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/players-entity.js
class PlayersEntity (line 10) | class PlayersEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/players-state-entity.js
class PlayersStateEntity (line 9) | class PlayersStateEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/players-stats-entity.js
class PlayersStatsEntity (line 9) | class PlayersStatsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/respawn-entity.js
class RespawnEntity (line 10) | class RespawnEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/rewards-entity.js
class RewardsEntity (line 10) | class RewardsEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/rewards-events-entity.js
class RewardsEventsEntity (line 9) | class RewardsEventsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/rewards-events-state-entity.js
class RewardsEventsStateEntity (line 9) | class RewardsEventsStateEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/rewards-modifiers-entity.js
class RewardsModifiersEntity (line 9) | class RewardsModifiersEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/rooms-change-points-entity.js
class RoomsChangePointsEntity (line 9) | class RoomsChangePointsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/rooms-entity.js
class RoomsEntity (line 10) | class RoomsEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/rooms-return-points-entity.js
class RoomsReturnPointsEntity (line 9) | class RoomsReturnPointsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/scores-detail-entity.js
class ScoresDetailEntity (line 9) | class ScoresDetailEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/scores-entity.js
class ScoresEntity (line 10) | class ScoresEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-class-level-up-animations-entity.js
class SkillsClassLevelUpAnimationsEntity (line 9) | class SkillsClassLevelUpAnimationsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-class-path-entity.js
class SkillsClassPathEntity (line 10) | class SkillsClassPathEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-class-path-level-labels-entity.js
class SkillsClassPathLevelLabelsEntity (line 9) | class SkillsClassPathLevelLabelsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-class-path-level-skills-entity.js
class SkillsClassPathLevelSkillsEntity (line 9) | class SkillsClassPathLevelSkillsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-groups-entity.js
class SkillsGroupsEntity (line 9) | class SkillsGroupsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-levels-entity.js
class SkillsLevelsEntity (line 9) | class SkillsLevelsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-levels-modifiers-conditions-entity.js
class SkillsLevelsModifiersConditionsEntity (line 9) | class SkillsLevelsModifiersConditionsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-levels-modifiers-entity.js
class SkillsLevelsModifiersEntity (line 9) | class SkillsLevelsModifiersEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-levels-set-entity.js
class SkillsLevelsSetEntity (line 10) | class SkillsLevelsSetEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-owners-class-path-entity.js
class SkillsOwnersClassPathEntity (line 9) | class SkillsOwnersClassPathEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-animations-entity.js
class SkillsSkillAnimationsEntity (line 9) | class SkillsSkillAnimationsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-attack-entity.js
class SkillsSkillAttackEntity (line 10) | class SkillsSkillAttackEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-entity.js
class SkillsSkillEntity (line 10) | class SkillsSkillEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-group-relation-entity.js
class SkillsSkillGroupRelationEntity (line 9) | class SkillsSkillGroupRelationEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-owner-conditions-entity.js
class SkillsSkillOwnerConditionsEntity (line 9) | class SkillsSkillOwnerConditionsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-owner-effects-conditions-entity.js
class SkillsSkillOwnerEffectsConditionsEntity (line 9) | class SkillsSkillOwnerEffectsConditionsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-owner-effects-entity.js
class SkillsSkillOwnerEffectsEntity (line 9) | class SkillsSkillOwnerEffectsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-physical-data-entity.js
class SkillsSkillPhysicalDataEntity (line 9) | class SkillsSkillPhysicalDataEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-target-effects-conditions-entity.js
class SkillsSkillTargetEffectsConditionsEntity (line 9) | class SkillsSkillTargetEffectsConditionsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-target-effects-entity.js
class SkillsSkillTargetEffectsEntity (line 9) | class SkillsSkillTargetEffectsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/skills-skill-type-entity.js
class SkillsSkillTypeEntity (line 9) | class SkillsSkillTypeEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/snippets-entity.js
class SnippetsEntity (line 10) | class SnippetsEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/stats-entity.js
class StatsEntity (line 10) | class StatsEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/target-options-entity.js
class TargetOptionsEntity (line 9) | class TargetOptionsEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/users-entity.js
class UsersEntity (line 10) | class UsersEntity extends EntityProperties
method propertiesConfig (line 13) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/users-locale-entity.js
class UsersLocaleEntity (line 9) | class UsersLocaleEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/entities/users-login-entity.js
class UsersLoginEntity (line 9) | class UsersLoginEntity extends EntityProperties
method propertiesConfig (line 12) | static propertiesConfig(extraProps)
FILE: generated-entities/models/mikro-orm/ads-banner-model.js
class AdsBannerModel (line 10) | class AdsBannerModel
method constructor (line 13) | constructor(id, ads_id, banner_data)
method createByProps (line 20) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/ads-event-video-model.js
class AdsEventVideoModel (line 10) | class AdsEventVideoModel
method constructor (line 13) | constructor(id, ads_id, event_key, event_data)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/ads-model.js
class AdsModel (line 10) | class AdsModel
method constructor (line 13) | constructor(id, key, provider_id, type_id, width, height, position, to...
method createByProps (line 32) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/ads-played-model.js
class AdsPlayedModel (line 10) | class AdsPlayedModel
method constructor (line 13) | constructor(id, ads_id, player_id, started_at, ended_at)
method createByProps (line 22) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/ads-providers-model.js
class AdsProvidersModel (line 10) | class AdsProvidersModel
method constructor (line 13) | constructor(id, key, enabled)
method createByProps (line 20) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/ads-types-model.js
class AdsTypesModel (line 10) | class AdsTypesModel
method constructor (line 13) | constructor(id, key)
method createByProps (line 19) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/audio-categories-model.js
class AudioCategoriesModel (line 10) | class AudioCategoriesModel
method constructor (line 13) | constructor(id, category_key, category_label, enabled, single_audio, c...
method createByProps (line 24) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/audio-markers-model.js
class AudioMarkersModel (line 10) | class AudioMarkersModel
method constructor (line 13) | constructor(id, audio_id, marker_key, start, duration, config)
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/audio-model.js
class AudioModel (line 10) | class AudioModel
method constructor (line 13) | constructor(id, audio_key, files_name, config, room_id, category_id, e...
method createByProps (line 26) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/audio-player-config-model.js
class AudioPlayerConfigModel (line 10) | class AudioPlayerConfigModel
method constructor (line 13) | constructor(id, player_id, category_id, enabled)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/chat-message-types-model.js
class ChatMessageTypesModel (line 10) | class ChatMessageTypesModel
method constructor (line 13) | constructor(id, key, show_tab, also_show_in_type)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/chat-model.js
class ChatModel (line 10) | class ChatModel
method constructor (line 13) | constructor(id, player_id, room_id, message, private_player_id, messag...
method createByProps (line 24) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/clan-levels-model.js
class ClanLevelsModel (line 10) | class ClanLevelsModel
method constructor (line 13) | constructor(id, key, label, required_experience)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/clan-levels-modifiers-model.js
class ClanLevelsModifiersModel (line 10) | class ClanLevelsModifiersModel
method constructor (line 13) | constructor(id, level_id, key, property_key, operation, value, minValu...
method createByProps (line 27) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/clan-members-model.js
class ClanMembersModel (line 10) | class ClanMembersModel
method constructor (line 13) | constructor(id, clan_id, player_id)
method createByProps (line 20) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/clan-model.js
class ClanModel (line 10) | class ClanModel
method constructor (line 13) | constructor(id, owner_id, name, points, level, created_at, updated_at)
method createByProps (line 24) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/config-model.js
class ConfigModel (line 10) | class ConfigModel
method constructor (line 13) | constructor(id, scope, path, value, type)
method createByProps (line 22) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/config-types-model.js
class ConfigTypesModel (line 10) | class ConfigTypesModel
method constructor (line 13) | constructor(id, label)
method createByProps (line 19) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/drops-animations-model.js
class DropsAnimationsModel (line 10) | class DropsAnimationsModel
method constructor (line 13) | constructor(id, item_id, asset_type, asset_key, file, extra_params)
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/features-model.js
class FeaturesModel (line 10) | class FeaturesModel
method constructor (line 13) | constructor(id, code, title, is_enabled)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/items-group-model.js
class ItemsGroupModel (line 10) | class ItemsGroupModel
method constructor (line 13) | constructor(id, key, label, description, files_name, sort, items_limit...
method createByProps (line 25) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/items-inventory-model.js
class ItemsInventoryModel (line 10) | class ItemsInventoryModel
method constructor (line 13) | constructor(id, owner_id, item_id, qty, remaining_uses, is_active)
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/items-item-model.js
class ItemsItemModel (line 10) | class ItemsItemModel
method constructor (line 13) | constructor(id, key, type, group_id, label, description, qty_limit, us...
method createByProps (line 30) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/items-item-modifiers-model.js
class ItemsItemModifiersModel (line 10) | class ItemsItemModifiersModel
method constructor (line 13) | constructor(id, item_id, key, property_key, operation, value, maxPrope...
method createByProps (line 24) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/items-types-model.js
class ItemsTypesModel (line 10) | class ItemsTypesModel
method constructor (line 13) | constructor(id, key)
method createByProps (line 19) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/locale-model.js
class LocaleModel (line 10) | class LocaleModel
method constructor (line 13) | constructor(id, locale, language_code, country_code, enabled)
method createByProps (line 22) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/objects-animations-model.js
class ObjectsAnimationsModel (line 10) | class ObjectsAnimationsModel
method constructor (line 13) | constructor(id, object_id, animationKey, animationData)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/objects-assets-model.js
class ObjectsAssetsModel (line 10) | class ObjectsAssetsModel
method constructor (line 13) | constructor(object_asset_id, object_id, asset_type, asset_key, asset_f...
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/objects-items-inventory-model.js
class ObjectsItemsInventoryModel (line 10) | class ObjectsItemsInventoryModel
method constructor (line 13) | constructor(id, owner_id, item_id, qty, remaining_uses, is_active)
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/objects-items-requirements-model.js
class ObjectsItemsRequirementsModel (line 10) | class ObjectsItemsRequirementsModel
method constructor (line 13) | constructor(id, object_id, item_key, required_item_key, required_quant...
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/objects-items-rewards-model.js
class ObjectsItemsRewardsModel (line 10) | class ObjectsItemsRewardsModel
method constructor (line 13) | constructor(id, object_id, item_key, reward_item_key, reward_quantity,...
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/objects-model.js
class ObjectsModel (line 10) | class ObjectsModel
method constructor (line 13) | constructor(id, room_id, layer_name, tile_index, class_type, object_cl...
method createByProps (line 30) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/objects-skills-model.js
class ObjectsSkillsModel (line 10) | class ObjectsSkillsModel
method constructor (line 13) | constructor(id, object_id, skill_id, target_id)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/objects-stats-model.js
class ObjectsStatsModel (line 10) | class ObjectsStatsModel
method constructor (line 13) | constructor(id, object_id, stat_id, base_value, value)
method createByProps (line 22) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/objects-types-model.js
class ObjectsTypesModel (line 10) | class ObjectsTypesModel
method constructor (line 13) | constructor(id, key)
method createByProps (line 19) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/operation-types-model.js
class OperationTypesModel (line 10) | class OperationTypesModel
method constructor (line 13) | constructor(id, label, key)
method createByProps (line 20) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/players-model.js
class PlayersModel (line 10) | class PlayersModel
method constructor (line 13) | constructor(id, user_id, name, created_at, updated_at)
method createByProps (line 22) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/players-state-model.js
class PlayersStateModel (line 10) | class PlayersStateModel
method constructor (line 13) | constructor(id, player_id, room_id, x, y, dir)
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/players-stats-model.js
class PlayersStatsModel (line 10) | class PlayersStatsModel
method constructor (line 13) | constructor(id, player_id, stat_id, base_value, value)
method createByProps (line 22) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/respawn-model.js
class RespawnModel (line 10) | class RespawnModel
method constructor (line 13) | constructor(id, object_id, respawn_time, instances_limit, layer, creat...
method createByProps (line 24) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/rewards-events-model.js
class RewardsEventsModel (line 10) | class RewardsEventsModel
method constructor (line 13) | constructor(id, label, description, handler_key, event_key, event_data...
method createByProps (line 27) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/rewards-events-state-model.js
class RewardsEventsStateModel (line 10) | class RewardsEventsStateModel
method constructor (line 13) | constructor(id, rewards_events_id, player_id, state)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/rewards-model.js
class RewardsModel (line 10) | class RewardsModel
method constructor (line 13) | constructor(id, object_id, item_id, modifier_id, experience, drop_rate...
method createByProps (line 29) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/rewards-modifiers-model.js
class RewardsModifiersModel (line 10) | class RewardsModifiersModel
method constructor (line 13) | constructor(id, key, property_key, operation, value, minValue, maxValu...
method createByProps (line 26) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/rooms-change-points-model.js
class RoomsChangePointsModel (line 10) | class RoomsChangePointsModel
method constructor (line 13) | constructor(id, room_id, tile_index, next_room_id)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/rooms-model.js
class RoomsModel (line 10) | class RoomsModel
method constructor (line 13) | constructor(id, name, title, map_filename, scene_images, room_class_ke...
method createByProps (line 27) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/rooms-return-points-model.js
class RoomsReturnPointsModel (line 10) | class RoomsReturnPointsModel
method constructor (line 13) | constructor(id, room_id, direction, x, y, is_default, from_room_id)
method createByProps (line 24) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/scores-detail-model.js
class ScoresDetailModel (line 10) | class ScoresDetailModel
method constructor (line 13) | constructor(id, player_id, obtained_score, kill_time, kill_player_id, ...
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/scores-model.js
class ScoresModel (line 10) | class ScoresModel
method constructor (line 13) | constructor(id, player_id, total_score, players_kills_count, npcs_kill...
method createByProps (line 26) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-class-level-up-animations-model.js
class SkillsClassLevelUpAnimationsModel (line 10) | class SkillsClassLevelUpAnimationsModel
method constructor (line 13) | constructor(id, class_path_id, level_id, animationData)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-class-path-level-labels-model.js
class SkillsClassPathLevelLabelsModel (line 10) | class SkillsClassPathLevelLabelsModel
method constructor (line 13) | constructor(id, class_path_id, level_id, label)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-class-path-level-skills-model.js
class SkillsClassPathLevelSkillsModel (line 10) | class SkillsClassPathLevelSkillsModel
method constructor (line 13) | constructor(id, class_path_id, level_id, skill_id)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-class-path-model.js
class SkillsClassPathModel (line 10) | class SkillsClassPathModel
method constructor (line 13) | constructor(id, key, label, levels_set_id, enabled, created_at, update...
method createByProps (line 24) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-groups-model.js
class SkillsGroupsModel (line 10) | class SkillsGroupsModel
method constructor (line 13) | constructor(id, key, label, description, sort)
method createByProps (line 22) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-levels-model.js
class SkillsLevelsModel (line 10) | class SkillsLevelsModel
method constructor (line 13) | constructor(id, key, label, required_experience, level_set_id)
method createByProps (line 22) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-levels-modifiers-conditions-model.js
class SkillsLevelsModifiersConditionsModel (line 10) | class SkillsLevelsModifiersConditionsModel
method constructor (line 13) | constructor(id, levels_modifier_id, key, property_key, conditional, va...
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-levels-modifiers-model.js
class SkillsLevelsModifiersModel (line 10) | class SkillsLevelsModifiersModel
method constructor (line 13) | constructor(id, level_id, key, property_key, operation, value, minValu...
method createByProps (line 27) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-levels-set-model.js
class SkillsLevelsSetModel (line 10) | class SkillsLevelsSetModel
method constructor (line 13) | constructor(id, key, label, autoFillRanges, autoFillExperienceMultipli...
method createByProps (line 24) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-owners-class-path-model.js
class SkillsOwnersClassPathModel (line 10) | class SkillsOwnersClassPathModel
method constructor (line 13) | constructor(id, class_path_id, owner_id, currentLevel, currentExp)
method createByProps (line 22) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-animations-model.js
class SkillsSkillAnimationsModel (line 10) | class SkillsSkillAnimationsModel
method constructor (line 13) | constructor(id, skill_id, key, classKey, animationData)
method createByProps (line 22) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-attack-model.js
class SkillsSkillAttackModel (line 10) | class SkillsSkillAttackModel
method constructor (line 13) | constructor(id, skill_id, affectedProperty, allowEffectBelowZero, hitD...
method createByProps (line 31) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-group-relation-model.js
class SkillsSkillGroupRelationModel (line 10) | class SkillsSkillGroupRelationModel
method constructor (line 13) | constructor(id, skill_id, group_id)
method createByProps (line 20) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-model.js
class SkillsSkillModel (line 10) | class SkillsSkillModel
method constructor (line 13) | constructor(id, key, type, label, autoValidation, skillDelay, castTime...
method createByProps (line 38) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-owner-conditions-model.js
class SkillsSkillOwnerConditionsModel (line 10) | class SkillsSkillOwnerConditionsModel
method constructor (line 13) | constructor(id, skill_id, key, property_key, conditional, value)
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-owner-effects-conditions-model.js
class SkillsSkillOwnerEffectsConditionsModel (line 10) | class SkillsSkillOwnerEffectsConditionsModel
method constructor (line 13) | constructor(id, skill_owner_effect_id, key, property_key, conditional,...
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-owner-effects-model.js
class SkillsSkillOwnerEffectsModel (line 10) | class SkillsSkillOwnerEffectsModel
method constructor (line 13) | constructor(id, skill_id, key, property_key, operation, value, minValu...
method createByProps (line 27) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-physical-data-model.js
class SkillsSkillPhysicalDataModel (line 10) | class SkillsSkillPhysicalDataModel
method constructor (line 13) | constructor(id, skill_id, magnitude, objectWidth, objectHeight, valida...
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-target-effects-conditions-model.js
class SkillsSkillTargetEffectsConditionsModel (line 10) | class SkillsSkillTargetEffectsConditionsModel
method constructor (line 13) | constructor(id, skill_target_effect_id, key, property_key, conditional...
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-target-effects-model.js
class SkillsSkillTargetEffectsModel (line 10) | class SkillsSkillTargetEffectsModel
method constructor (line 13) | constructor(id, skill_id, key, property_key, operation, value, minValu...
method createByProps (line 27) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/skills-skill-type-model.js
class SkillsSkillTypeModel (line 10) | class SkillsSkillTypeModel
method constructor (line 13) | constructor(id, key)
method createByProps (line 19) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/snippets-model.js
class SnippetsModel (line 10) | class SnippetsModel
method constructor (line 13) | constructor(id, locale_id, key, value, created_at, updated_at)
method createByProps (line 23) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/stats-model.js
class StatsModel (line 10) | class StatsModel
method constructor (line 13) | constructor(id, key, label, description, base_value, customData, creat...
method createByProps (line 25) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/target-options-model.js
class TargetOptionsModel (line 10) | class TargetOptionsModel
method constructor (line 13) | constructor(id, target_key, target_label)
method createByProps (line 20) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/users-locale-model.js
class UsersLocaleModel (line 10) | class UsersLocaleModel
method constructor (line 13) | constructor(id, locale_id, user_id)
method createByProps (line 20) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/users-login-model.js
class UsersLoginModel (line 10) | class UsersLoginModel
method constructor (line 13) | constructor(id, user_id, login_date, logout_date)
method createByProps (line 21) | static createByProps(props)
FILE: generated-entities/models/mikro-orm/users-model.js
class UsersModel (line 10) | class UsersModel
method constructor (line 13) | constructor(id, email, username, password, role_id, status, created_at...
method createByProps (line 27) | static createByProps(props)
FILE: generated-entities/models/objection-js/ads-banner-model.js
class AdsBannerModel (line 9) | class AdsBannerModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/ads-event-video-model.js
class AdsEventVideoModel (line 9) | class AdsEventVideoModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/ads-model.js
class AdsModel (line 9) | class AdsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/ads-played-model.js
class AdsPlayedModel (line 9) | class AdsPlayedModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/ads-providers-model.js
class AdsProvidersModel (line 9) | class AdsProvidersModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/ads-types-model.js
class AdsTypesModel (line 9) | class AdsTypesModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/audio-categories-model.js
class AudioCategoriesModel (line 9) | class AudioCategoriesModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/audio-markers-model.js
class AudioMarkersModel (line 9) | class AudioMarkersModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/audio-model.js
class AudioModel (line 9) | class AudioModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/audio-player-config-model.js
class AudioPlayerConfigModel (line 9) | class AudioPlayerConfigModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/chat-message-types-model.js
class ChatMessageTypesModel (line 9) | class ChatMessageTypesModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/chat-model.js
class ChatModel (line 9) | class ChatModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/clan-levels-model.js
class ClanLevelsModel (line 9) | class ClanLevelsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/clan-levels-modifiers-model.js
class ClanLevelsModifiersModel (line 9) | class ClanLevelsModifiersModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/clan-members-model.js
class ClanMembersModel (line 9) | class ClanMembersModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/clan-model.js
class ClanModel (line 9) | class ClanModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/config-model.js
class ConfigModel (line 9) | class ConfigModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/config-types-model.js
class ConfigTypesModel (line 9) | class ConfigTypesModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/drops-animations-model.js
class DropsAnimationsModel (line 9) | class DropsAnimationsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/features-model.js
class FeaturesModel (line 9) | class FeaturesModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
FILE: generated-entities/models/objection-js/items-group-model.js
class ItemsGroupModel (line 9) | class ItemsGroupModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/items-inventory-model.js
class ItemsInventoryModel (line 9) | class ItemsInventoryModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/items-item-model.js
class ItemsItemModel (line 9) | class ItemsItemModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/items-item-modifiers-model.js
class ItemsItemModifiersModel (line 9) | class ItemsItemModifiersModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/items-types-model.js
class ItemsTypesModel (line 9) | class ItemsTypesModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/locale-model.js
class LocaleModel (line 9) | class LocaleModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/objects-animations-model.js
class ObjectsAnimationsModel (line 9) | class ObjectsAnimationsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/objects-assets-model.js
class ObjectsAssetsModel (line 9) | class ObjectsAssetsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method idColumn (line 17) | static get idColumn()
method relationMappings (line 22) | static get relationMappings()
FILE: generated-entities/models/objection-js/objects-items-inventory-model.js
class ObjectsItemsInventoryModel (line 9) | class ObjectsItemsInventoryModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/objects-items-requirements-model.js
class ObjectsItemsRequirementsModel (line 9) | class ObjectsItemsRequirementsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/objects-items-rewards-model.js
class ObjectsItemsRewardsModel (line 9) | class ObjectsItemsRewardsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/objects-model.js
class ObjectsModel (line 9) | class ObjectsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/objects-skills-model.js
class ObjectsSkillsModel (line 9) | class ObjectsSkillsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/objects-stats-model.js
class ObjectsStatsModel (line 9) | class ObjectsStatsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/objects-types-model.js
class ObjectsTypesModel (line 9) | class ObjectsTypesModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/operation-types-model.js
class OperationTypesModel (line 9) | class OperationTypesModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/players-model.js
class PlayersModel (line 9) | class PlayersModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/players-state-model.js
class PlayersStateModel (line 9) | class PlayersStateModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/players-stats-model.js
class PlayersStatsModel (line 9) | class PlayersStatsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/respawn-model.js
class RespawnModel (line 9) | class RespawnModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/rewards-events-model.js
class RewardsEventsModel (line 9) | class RewardsEventsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/rewards-events-state-model.js
class RewardsEventsStateModel (line 9) | class RewardsEventsStateModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/rewards-model.js
class RewardsModel (line 9) | class RewardsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/rewards-modifiers-model.js
class RewardsModifiersModel (line 9) | class RewardsModifiersModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/rooms-change-points-model.js
class RoomsChangePointsModel (line 9) | class RoomsChangePointsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/rooms-model.js
class RoomsModel (line 9) | class RoomsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/rooms-return-points-model.js
class RoomsReturnPointsModel (line 9) | class RoomsReturnPointsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/scores-detail-model.js
class ScoresDetailModel (line 9) | class ScoresDetailModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/scores-model.js
class ScoresModel (line 9) | class ScoresModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-class-level-up-animations-model.js
class SkillsClassLevelUpAnimationsModel (line 9) | class SkillsClassLevelUpAnimationsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-class-path-level-labels-model.js
class SkillsClassPathLevelLabelsModel (line 9) | class SkillsClassPathLevelLabelsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-class-path-level-skills-model.js
class SkillsClassPathLevelSkillsModel (line 9) | class SkillsClassPathLevelSkillsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-class-path-model.js
class SkillsClassPathModel (line 9) | class SkillsClassPathModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-groups-model.js
class SkillsGroupsModel (line 9) | class SkillsGroupsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-levels-model.js
class SkillsLevelsModel (line 9) | class SkillsLevelsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-levels-modifiers-conditions-model.js
class SkillsLevelsModifiersConditionsModel (line 9) | class SkillsLevelsModifiersConditionsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
FILE: generated-entities/models/objection-js/skills-levels-modifiers-model.js
class SkillsLevelsModifiersModel (line 9) | class SkillsLevelsModifiersModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-levels-set-model.js
class SkillsLevelsSetModel (line 9) | class SkillsLevelsSetModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-owners-class-path-model.js
class SkillsOwnersClassPathModel (line 9) | class SkillsOwnersClassPathModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-animations-model.js
class SkillsSkillAnimationsModel (line 9) | class SkillsSkillAnimationsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-attack-model.js
class SkillsSkillAttackModel (line 9) | class SkillsSkillAttackModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-group-relation-model.js
class SkillsSkillGroupRelationModel (line 9) | class SkillsSkillGroupRelationModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-model.js
class SkillsSkillModel (line 9) | class SkillsSkillModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-owner-conditions-model.js
class SkillsSkillOwnerConditionsModel (line 9) | class SkillsSkillOwnerConditionsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-owner-effects-conditions-model.js
class SkillsSkillOwnerEffectsConditionsModel (line 9) | class SkillsSkillOwnerEffectsConditionsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-owner-effects-model.js
class SkillsSkillOwnerEffectsModel (line 9) | class SkillsSkillOwnerEffectsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-physical-data-model.js
class SkillsSkillPhysicalDataModel (line 9) | class SkillsSkillPhysicalDataModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-target-effects-conditions-model.js
class SkillsSkillTargetEffectsConditionsModel (line 9) | class SkillsSkillTargetEffectsConditionsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-target-effects-model.js
class SkillsSkillTargetEffectsModel (line 9) | class SkillsSkillTargetEffectsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/skills-skill-type-model.js
class SkillsSkillTypeModel (line 9) | class SkillsSkillTypeModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/snippets-model.js
class SnippetsModel (line 9) | class SnippetsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/stats-model.js
class StatsModel (line 9) | class StatsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/target-options-model.js
class TargetOptionsModel (line 9) | class TargetOptionsModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/users-locale-model.js
class UsersLocaleModel (line 9) | class UsersLocaleModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/users-login-model.js
class UsersLoginModel (line 9) | class UsersLoginModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/objection-js/users-model.js
class UsersModel (line 9) | class UsersModel extends ObjectionJsRawModel
method tableName (line 12) | static get tableName()
method relationMappings (line 17) | static get relationMappings()
FILE: generated-entities/models/prisma/ads-banner-model.js
class AdsBannerModel (line 7) | class AdsBannerModel
method constructor (line 10) | constructor(id, ads_id, banner_data)
method tableName (line 17) | static get tableName()
method relationTypes (line 23) | static get relationTypes()
method relationMappings (line 30) | static get relationMappings()
FILE: generated-entities/models/prisma/ads-event-video-model.js
class AdsEventVideoModel (line 7) | class AdsEventVideoModel
method constructor (line 10) | constructor(id, ads_id, event_key, event_data)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 31) | static get relationMappings()
FILE: generated-entities/models/prisma/ads-model.js
class AdsModel (line 7) | class AdsModel
method constructor (line 10) | constructor(id, key, provider_id, type_id, width, height, position, to...
method tableName (line 29) | static get tableName()
method relationTypes (line 35) | static get relationTypes()
method relationMappings (line 46) | static get relationMappings()
FILE: generated-entities/models/prisma/ads-played-model.js
class AdsPlayedModel (line 7) | class AdsPlayedModel
method constructor (line 10) | constructor(id, ads_id, player_id, started_at, ended_at)
method tableName (line 19) | static get tableName()
method relationTypes (line 25) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/ads-providers-model.js
class AdsProvidersModel (line 7) | class AdsProvidersModel
method constructor (line 10) | constructor(id, key, enabled)
method tableName (line 17) | static get tableName()
method relationTypes (line 23) | static get relationTypes()
method relationMappings (line 30) | static get relationMappings()
FILE: generated-entities/models/prisma/ads-types-model.js
class AdsTypesModel (line 7) | class AdsTypesModel
method constructor (line 10) | constructor(id, key)
method tableName (line 16) | static get tableName()
method relationTypes (line 22) | static get relationTypes()
method relationMappings (line 29) | static get relationMappings()
FILE: generated-entities/models/prisma/audio-categories-model.js
class AudioCategoriesModel (line 7) | class AudioCategoriesModel
method constructor (line 10) | constructor(id, category_key, category_label, enabled, single_audio, c...
method tableName (line 21) | static get tableName()
method relationTypes (line 27) | static get relationTypes()
method relationMappings (line 35) | static get relationMappings()
FILE: generated-entities/models/prisma/audio-markers-model.js
class AudioMarkersModel (line 7) | class AudioMarkersModel
method constructor (line 10) | constructor(id, audio_id, marker_key, start, duration, config)
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/audio-model.js
class AudioModel (line 7) | class AudioModel
method constructor (line 10) | constructor(id, audio_key, files_name, config, room_id, category_id, e...
method tableName (line 23) | static get tableName()
method relationTypes (line 29) | static get relationTypes()
method relationMappings (line 38) | static get relationMappings()
FILE: generated-entities/models/prisma/audio-player-config-model.js
class AudioPlayerConfigModel (line 7) | class AudioPlayerConfigModel
method constructor (line 10) | constructor(id, player_id, category_id, enabled)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 32) | static get relationMappings()
FILE: generated-entities/models/prisma/chat-message-types-model.js
class ChatMessageTypesModel (line 7) | class ChatMessageTypesModel
method constructor (line 10) | constructor(id, key, show_tab, also_show_in_type)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/chat-model.js
class ChatModel (line 7) | class ChatModel
method constructor (line 10) | constructor(id, player_id, room_id, message, private_player_id, messag...
method tableName (line 21) | static get tableName()
method relationTypes (line 27) | static get relationTypes()
method relationMappings (line 37) | static get relationMappings()
FILE: generated-entities/models/prisma/clan-levels-model.js
class ClanLevelsModel (line 7) | class ClanLevelsModel
method constructor (line 10) | constructor(id, key, label, required_experience)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 32) | static get relationMappings()
FILE: generated-entities/models/prisma/clan-levels-modifiers-model.js
class ClanLevelsModifiersModel (line 7) | class ClanLevelsModifiersModel
method constructor (line 10) | constructor(id, level_id, key, property_key, operation, value, minValu...
method tableName (line 24) | static get tableName()
method relationTypes (line 30) | static get relationTypes()
method relationMappings (line 38) | static get relationMappings()
FILE: generated-entities/models/prisma/clan-members-model.js
class ClanMembersModel (line 7) | class ClanMembersModel
method constructor (line 10) | constructor(id, clan_id, player_id)
method tableName (line 17) | static get tableName()
method relationTypes (line 23) | static get relationTypes()
method relationMappings (line 31) | static get relationMappings()
FILE: generated-entities/models/prisma/clan-model.js
class ClanModel (line 7) | class ClanModel
method constructor (line 10) | constructor(id, owner_id, name, points, level, created_at, updated_at)
method tableName (line 21) | static get tableName()
method relationTypes (line 27) | static get relationTypes()
method relationMappings (line 36) | static get relationMappings()
FILE: generated-entities/models/prisma/config-model.js
class ConfigModel (line 7) | class ConfigModel
method constructor (line 10) | constructor(id, scope, path, value, type)
method tableName (line 19) | static get tableName()
method relationTypes (line 25) | static get relationTypes()
method relationMappings (line 32) | static get relationMappings()
FILE: generated-entities/models/prisma/config-types-model.js
class ConfigTypesModel (line 7) | class ConfigTypesModel
method constructor (line 10) | constructor(id, label)
method tableName (line 16) | static get tableName()
method relationTypes (line 22) | static get relationTypes()
method relationMappings (line 29) | static get relationMappings()
FILE: generated-entities/models/prisma/drops-animations-model.js
class DropsAnimationsModel (line 7) | class DropsAnimationsModel
method constructor (line 10) | constructor(id, item_id, asset_type, asset_key, file, extra_params)
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/features-model.js
class FeaturesModel (line 7) | class FeaturesModel
method constructor (line 10) | constructor(id, code, title, is_enabled)
method tableName (line 18) | static get tableName()
FILE: generated-entities/models/prisma/items-group-model.js
class ItemsGroupModel (line 7) | class ItemsGroupModel
method constructor (line 10) | constructor(id, key, label, description, files_name, sort, items_limit...
method tableName (line 22) | static get tableName()
method relationTypes (line 28) | static get relationTypes()
method relationMappings (line 35) | static get relationMappings()
FILE: generated-entities/models/prisma/items-inventory-model.js
class ItemsInventoryModel (line 7) | class ItemsInventoryModel
method constructor (line 10) | constructor(id, owner_id, item_id, qty, remaining_uses, is_active)
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 34) | static get relationMappings()
FILE: generated-entities/models/prisma/items-item-model.js
class ItemsItemModel (line 7) | class ItemsItemModel
method constructor (line 10) | constructor(id, key, type, group_id, label, description, qty_limit, us...
method tableName (line 27) | static get tableName()
method relationTypes (line 33) | static get relationTypes()
method relationMappings (line 50) | static get relationMappings()
FILE: generated-entities/models/prisma/items-item-modifiers-model.js
class ItemsItemModifiersModel (line 7) | class ItemsItemModifiersModel
method constructor (line 10) | constructor(id, item_id, key, property_key, operation, value, maxPrope...
method tableName (line 21) | static get tableName()
method relationTypes (line 27) | static get relationTypes()
method relationMappings (line 35) | static get relationMappings()
FILE: generated-entities/models/prisma/items-types-model.js
class ItemsTypesModel (line 7) | class ItemsTypesModel
method constructor (line 10) | constructor(id, key)
method tableName (line 16) | static get tableName()
method relationTypes (line 22) | static get relationTypes()
method relationMappings (line 29) | static get relationMappings()
FILE: generated-entities/models/prisma/locale-model.js
class LocaleModel (line 7) | class LocaleModel
method constructor (line 10) | constructor(id, locale, language_code, country_code, enabled)
method tableName (line 19) | static get tableName()
method relationTypes (line 25) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/objects-animations-model.js
class ObjectsAnimationsModel (line 7) | class ObjectsAnimationsModel
method constructor (line 10) | constructor(id, object_id, animationKey, animationData)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 31) | static get relationMappings()
FILE: generated-entities/models/prisma/objects-assets-model.js
class ObjectsAssetsModel (line 7) | class ObjectsAssetsModel
method constructor (line 10) | constructor(object_asset_id, object_id, asset_type, asset_key, asset_f...
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/objects-items-inventory-model.js
class ObjectsItemsInventoryModel (line 7) | class ObjectsItemsInventoryModel
method constructor (line 10) | constructor(id, owner_id, item_id, qty, remaining_uses, is_active)
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 34) | static get relationMappings()
FILE: generated-entities/models/prisma/objects-items-requirements-model.js
class ObjectsItemsRequirementsModel (line 7) | class ObjectsItemsRequirementsModel
method constructor (line 10) | constructor(id, object_id, item_key, required_item_key, required_quant...
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 35) | static get relationMappings()
FILE: generated-entities/models/prisma/objects-items-rewards-model.js
class ObjectsItemsRewardsModel (line 7) | class ObjectsItemsRewardsModel
method constructor (line 10) | constructor(id, object_id, item_key, reward_item_key, reward_quantity,...
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 35) | static get relationMappings()
FILE: generated-entities/models/prisma/objects-model.js
class ObjectsModel (line 7) | class ObjectsModel
method constructor (line 10) | constructor(id, room_id, layer_name, tile_index, class_type, object_cl...
method tableName (line 27) | static get tableName()
method relationTypes (line 33) | static get relationTypes()
method relationMappings (line 50) | static get relationMappings()
FILE: generated-entities/models/prisma/objects-skills-model.js
class ObjectsSkillsModel (line 7) | class ObjectsSkillsModel
method constructor (line 10) | constructor(id, object_id, skill_id, target_id)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/objects-stats-model.js
class ObjectsStatsModel (line 7) | class ObjectsStatsModel
method constructor (line 10) | constructor(id, object_id, stat_id, base_value, value)
method tableName (line 19) | static get tableName()
method relationTypes (line 25) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/objects-types-model.js
class ObjectsTypesModel (line 7) | class ObjectsTypesModel
method constructor (line 10) | constructor(id, key)
method tableName (line 16) | static get tableName()
method relationTypes (line 22) | static get relationTypes()
method relationMappings (line 29) | static get relationMappings()
FILE: generated-entities/models/prisma/operation-types-model.js
class OperationTypesModel (line 7) | class OperationTypesModel
method constructor (line 10) | constructor(id, label, key)
method tableName (line 17) | static get tableName()
method relationTypes (line 23) | static get relationTypes()
method relationMappings (line 35) | static get relationMappings()
FILE: generated-entities/models/prisma/players-model.js
class PlayersModel (line 7) | class PlayersModel
method constructor (line 10) | constructor(id, user_id, name, created_at, updated_at)
method tableName (line 19) | static get tableName()
method relationTypes (line 25) | static get relationTypes()
method relationMappings (line 45) | static get relationMappings()
FILE: generated-entities/models/prisma/players-state-model.js
class PlayersStateModel (line 7) | class PlayersStateModel
method constructor (line 10) | constructor(id, player_id, room_id, x, y, dir)
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 34) | static get relationMappings()
FILE: generated-entities/models/prisma/players-stats-model.js
class PlayersStatsModel (line 7) | class PlayersStatsModel
method constructor (line 10) | constructor(id, player_id, stat_id, base_value, value)
method tableName (line 19) | static get tableName()
method relationTypes (line 25) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/respawn-model.js
class RespawnModel (line 7) | class RespawnModel
method constructor (line 10) | constructor(id, object_id, respawn_time, instances_limit, layer, creat...
method tableName (line 21) | static get tableName()
method relationTypes (line 27) | static get relationTypes()
method relationMappings (line 34) | static get relationMappings()
FILE: generated-entities/models/prisma/rewards-events-model.js
class RewardsEventsModel (line 7) | class RewardsEventsModel
method constructor (line 10) | constructor(id, label, description, handler_key, event_key, event_data...
method tableName (line 24) | static get tableName()
method relationTypes (line 30) | static get relationTypes()
method relationMappings (line 37) | static get relationMappings()
FILE: generated-entities/models/prisma/rewards-events-state-model.js
class RewardsEventsStateModel (line 7) | class RewardsEventsStateModel
method constructor (line 10) | constructor(id, rewards_events_id, player_id, state)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 32) | static get relationMappings()
FILE: generated-entities/models/prisma/rewards-model.js
class RewardsModel (line 7) | class RewardsModel
method constructor (line 10) | constructor(id, object_id, item_id, modifier_id, experience, drop_rate...
method tableName (line 26) | static get tableName()
method relationTypes (line 32) | static get relationTypes()
method relationMappings (line 41) | static get relationMappings()
FILE: generated-entities/models/prisma/rewards-modifiers-model.js
class RewardsModifiersModel (line 7) | class RewardsModifiersModel
method constructor (line 10) | constructor(id, key, property_key, operation, value, minValue, maxValu...
method tableName (line 23) | static get tableName()
method relationTypes (line 29) | static get relationTypes()
method relationMappings (line 37) | static get relationMappings()
FILE: generated-entities/models/prisma/rooms-change-points-model.js
class RoomsChangePointsModel (line 7) | class RoomsChangePointsModel
method constructor (line 10) | constructor(id, room_id, tile_index, next_room_id)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 32) | static get relationMappings()
FILE: generated-entities/models/prisma/rooms-model.js
class RoomsModel (line 7) | class RoomsModel
method constructor (line 10) | constructor(id, name, title, map_filename, scene_images, room_class_ke...
method tableName (line 24) | static get tableName()
method relationTypes (line 30) | static get relationTypes()
method relationMappings (line 44) | static get relationMappings()
FILE: generated-entities/models/prisma/rooms-return-points-model.js
class RoomsReturnPointsModel (line 7) | class RoomsReturnPointsModel
method constructor (line 10) | constructor(id, room_id, direction, x, y, is_default, from_room_id)
method tableName (line 21) | static get tableName()
method relationTypes (line 27) | static get relationTypes()
method relationMappings (line 35) | static get relationMappings()
FILE: generated-entities/models/prisma/scores-detail-model.js
class ScoresDetailModel (line 7) | class ScoresDetailModel
method constructor (line 10) | constructor(id, player_id, obtained_score, kill_time, kill_player_id, ...
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/scores-model.js
class ScoresModel (line 7) | class ScoresModel
method constructor (line 10) | constructor(id, player_id, total_score, players_kills_count, npcs_kill...
method tableName (line 23) | static get tableName()
method relationTypes (line 29) | static get relationTypes()
method relationMappings (line 36) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-class-level-up-animations-model.js
class SkillsClassLevelUpAnimationsModel (line 7) | class SkillsClassLevelUpAnimationsModel
method constructor (line 10) | constructor(id, class_path_id, level_id, animationData)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 32) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-class-path-level-labels-model.js
class SkillsClassPathLevelLabelsModel (line 7) | class SkillsClassPathLevelLabelsModel
method constructor (line 10) | constructor(id, class_path_id, level_id, label)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 32) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-class-path-level-skills-model.js
class SkillsClassPathLevelSkillsModel (line 7) | class SkillsClassPathLevelSkillsModel
method constructor (line 10) | constructor(id, class_path_id, level_id, skill_id)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-class-path-model.js
class SkillsClassPathModel (line 7) | class SkillsClassPathModel
method constructor (line 10) | constructor(id, key, label, levels_set_id, enabled, created_at, update...
method tableName (line 21) | static get tableName()
method relationTypes (line 27) | static get relationTypes()
method relationMappings (line 38) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-groups-model.js
class SkillsGroupsModel (line 7) | class SkillsGroupsModel
method constructor (line 10) | constructor(id, key, label, description, sort)
method tableName (line 19) | static get tableName()
method relationTypes (line 25) | static get relationTypes()
method relationMappings (line 32) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-levels-model.js
class SkillsLevelsModel (line 7) | class SkillsLevelsModel
method constructor (line 10) | constructor(id, key, label, required_experience, level_set_id)
method tableName (line 19) | static get tableName()
method relationTypes (line 25) | static get relationTypes()
method relationMappings (line 36) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-levels-modifiers-conditions-model.js
class SkillsLevelsModifiersConditionsModel (line 7) | class SkillsLevelsModifiersConditionsModel
method constructor (line 10) | constructor(id, levels_modifier_id, key, property_key, conditional, va...
method tableName (line 20) | static get tableName()
FILE: generated-entities/models/prisma/skills-levels-modifiers-model.js
class SkillsLevelsModifiersModel (line 7) | class SkillsLevelsModifiersModel
method constructor (line 10) | constructor(id, level_id, key, property_key, operation, value, minValu...
method tableName (line 24) | static get tableName()
method relationTypes (line 30) | static get relationTypes()
method relationMappings (line 38) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-levels-set-model.js
class SkillsLevelsSetModel (line 7) | class SkillsLevelsSetModel
method constructor (line 10) | constructor(id, key, label, autoFillRanges, autoFillExperienceMultipli...
method tableName (line 21) | static get tableName()
method relationTypes (line 27) | static get relationTypes()
method relationMappings (line 35) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-owners-class-path-model.js
class SkillsOwnersClassPathModel (line 7) | class SkillsOwnersClassPathModel
method constructor (line 10) | constructor(id, class_path_id, owner_id, currentLevel, currentExp)
method tableName (line 19) | static get tableName()
method relationTypes (line 25) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-animations-model.js
class SkillsSkillAnimationsModel (line 7) | class SkillsSkillAnimationsModel
method constructor (line 10) | constructor(id, skill_id, key, classKey, animationData)
method tableName (line 19) | static get tableName()
method relationTypes (line 25) | static get relationTypes()
method relationMappings (line 32) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-attack-model.js
class SkillsSkillAttackModel (line 7) | class SkillsSkillAttackModel
method constructor (line 10) | constructor(id, skill_id, affectedProperty, allowEffectBelowZero, hitD...
method tableName (line 28) | static get tableName()
method relationTypes (line 34) | static get relationTypes()
method relationMappings (line 41) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-group-relation-model.js
class SkillsSkillGroupRelationModel (line 7) | class SkillsSkillGroupRelationModel
method constructor (line 10) | constructor(id, skill_id, group_id)
method tableName (line 17) | static get tableName()
method relationTypes (line 23) | static get relationTypes()
method relationMappings (line 31) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-model.js
class SkillsSkillModel (line 7) | class SkillsSkillModel
method constructor (line 10) | constructor(id, key, type, label, autoValidation, skillDelay, castTime...
method tableName (line 35) | static get tableName()
method relationTypes (line 41) | static get relationTypes()
method relationMappings (line 57) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-owner-conditions-model.js
class SkillsSkillOwnerConditionsModel (line 7) | class SkillsSkillOwnerConditionsModel
method constructor (line 10) | constructor(id, skill_id, key, property_key, conditional, value)
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-owner-effects-conditions-model.js
class SkillsSkillOwnerEffectsConditionsModel (line 7) | class SkillsSkillOwnerEffectsConditionsModel
method constructor (line 10) | constructor(id, skill_owner_effect_id, key, property_key, conditional,...
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-owner-effects-model.js
class SkillsSkillOwnerEffectsModel (line 7) | class SkillsSkillOwnerEffectsModel
method constructor (line 10) | constructor(id, skill_id, key, property_key, operation, value, minValu...
method tableName (line 24) | static get tableName()
method relationTypes (line 30) | static get relationTypes()
method relationMappings (line 39) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-physical-data-model.js
class SkillsSkillPhysicalDataModel (line 7) | class SkillsSkillPhysicalDataModel
method constructor (line 10) | constructor(id, skill_id, magnitude, objectWidth, objectHeight, valida...
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-target-effects-conditions-model.js
class SkillsSkillTargetEffectsConditionsModel (line 7) | class SkillsSkillTargetEffectsConditionsModel
method constructor (line 10) | constructor(id, skill_target_effect_id, key, property_key, conditional...
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-target-effects-model.js
class SkillsSkillTargetEffectsModel (line 7) | class SkillsSkillTargetEffectsModel
method constructor (line 10) | constructor(id, skill_id, key, property_key, operation, value, minValu...
method tableName (line 24) | static get tableName()
method relationTypes (line 30) | static get relationTypes()
method relationMappings (line 39) | static get relationMappings()
FILE: generated-entities/models/prisma/skills-skill-type-model.js
class SkillsSkillTypeModel (line 7) | class SkillsSkillTypeModel
method constructor (line 10) | constructor(id, key)
method tableName (line 16) | static get tableName()
method relationTypes (line 22) | static get relationTypes()
method relationMappings (line 29) | static get relationMappings()
FILE: generated-entities/models/prisma/snippets-model.js
class SnippetsModel (line 7) | class SnippetsModel
method constructor (line 10) | constructor(id, locale_id, key, value, created_at, updated_at)
method tableName (line 20) | static get tableName()
method relationTypes (line 26) | static get relationTypes()
method relationMappings (line 33) | static get relationMappings()
FILE: generated-entities/models/prisma/stats-model.js
class StatsModel (line 7) | class StatsModel
method constructor (line 10) | constructor(id, key, label, description, base_value, customData, creat...
method tableName (line 22) | static get tableName()
method relationTypes (line 28) | static get relationTypes()
method relationMappings (line 36) | static get relationMappings()
FILE: generated-entities/models/prisma/target-options-model.js
class TargetOptionsModel (line 7) | class TargetOptionsModel
method constructor (line 10) | constructor(id, target_key, target_label)
method tableName (line 17) | static get tableName()
method relationTypes (line 23) | static get relationTypes()
method relationMappings (line 30) | static get relationMappings()
FILE: generated-entities/models/prisma/users-locale-model.js
class UsersLocaleModel (line 7) | class UsersLocaleModel
method constructor (line 10) | constructor(id, locale_id, user_id)
method tableName (line 17) | static get tableName()
method relationTypes (line 23) | static get relationTypes()
method relationMappings (line 31) | static get relationMappings()
FILE: generated-entities/models/prisma/users-login-model.js
class UsersLoginModel (line 7) | class UsersLoginModel
method constructor (line 10) | constructor(id, user_id, login_date, logout_date)
method tableName (line 18) | static get tableName()
method relationTypes (line 24) | static get relationTypes()
method relationMappings (line 31) | static get relationMappings()
FILE: generated-entities/models/prisma/users-model.js
class UsersModel (line 7) | class UsersModel
method constructor (line 10) | constructor(id, email, username, password, role_id, status, created_at...
method tableName (line 24) | static get tableName()
method relationTypes (line 30) | static get relationTypes()
method relationMappings (line 39) | static get relationMappings()
FILE: install/index.js
constant DB_CLIENTS_MAP (line 7) | const DB_CLIENTS_MAP = {
function toggleExpander (line 47) | function toggleExpander(isChecked, expander)
function showInstallError (line 97) | function showInstallError(code)
function updateClientOptions (line 115) | function updateClientOptions(driverValue, currentClient)
function startStatusPolling (line 155) | function startStatusPolling()
FILE: lib/actions/client/game-manager-enricher.js
class GameManagerEnricher (line 17) | class GameManagerEnricher
method withReceiver (line 26) | static withReceiver(player, roomEvents, gameManager)
FILE: lib/actions/client/messages-guard.js
class MessagesGuard (line 16) | class MessagesGuard
method validate (line 23) | static validate(message)
FILE: lib/actions/client/messages-handler.js
class MessagesHandler (line 18) | class MessagesHandler
method processOrQueueMessage (line 26) | static processOrQueueMessage(message, gameManager)
FILE: lib/actions/client/player-selector.js
class PlayerSelector (line 22) | class PlayerSelector
method constructor (line 28) | constructor(props)
method populateClassesSelector (line 50) | populateClassesSelector(classesData, playersConfig, activePlayer)
method appendAvatarOnSelector (line 101) | appendAvatarOnSelector(select, container, playersConfig)
FILE: lib/actions/client/plugin.js
class ActionsPlugin (line 24) | class ActionsPlugin extends PluginInterface
method setup (line 30) | setup(props)
method setTranslations (line 49) | setTranslations()
method listenEvents (line 60) | listenEvents()
FILE: lib/actions/client/preloader-handler.js
class PreloaderHandler (line 28) | class PreloaderHandler
method constructor (line 34) | constructor(props)
method setProperties (line 53) | setProperties(props)
method loadContents (line 78) | loadContents(uiScene)
method preloadClassPaths (line 95) | preloadClassPaths(uiScene)
method createAnimations (line 117) | createAnimations(preloadScene)
method createAvatarsAnimations (line 130) | createAvatarsAnimations(preloadScene)
method loopAnimationsAnd (line 159) | loopAnimationsAnd(animations, command, uiScene)
method preloadAnimation (line 180) | preloadAnimation(data, uiScene)
method preloadAnimationsInDirections (line 200) | preloadAnimationsInDirections(data, uiScene)
method preloadSpriteInDirection (line 231) | preloadSpriteInDirection(uiScene, data, direction)
method createAnimation (line 244) | createAnimation(data, uiScene)
method createWithMultipleDirections (line 265) | createWithMultipleDirections(uiScene, data, animDir)
method createWithDirection (line 286) | createWithDirection(data, uiScene, direction = '')
method prepareAnimationData (line 309) | prepareAnimationData(data, uiScene, direction = '')
method getAnimationKey (line 335) | getAnimationKey(data, direction = '')
FILE: lib/actions/client/receiver-wrapper.js
class ReceiverWrapper (line 34) | class ReceiverWrapper extends Receiver
method constructor (line 40) | constructor(props)
method processMessage (line 67) | processMessage(message)
method playHitAnimation (line 85) | playHitAnimation(message, currentScene)
method playAttackOrEffectAnimation (line 97) | playAttackOrEffectAnimation(message, currentScene)
method extractOwnerTargetAndType (line 143) | extractOwnerTargetAndType(currentScene, message)
method runHitAnimation (line 181) | runHitAnimation(x, y, currentScene, hitKey, targetKey, targetType)
method setTargetSpriteDepth (line 217) | setTargetSpriteDepth(targetSprite, hitAnimKey, targetSpriteId, hitSpri...
method updateLevelAndExperience (line 236) | updateLevelAndExperience(message)
method onInitClassPathEnd (line 266) | onInitClassPathEnd(message)
method onLevelUp (line 281) | onLevelUp(message)
method getLevelUpAnimationKey (line 298) | getLevelUpAnimationKey(level)
method onLevelExperienceAdded (line 322) | onLevelExperienceAdded(message)
method onSkillBeforeCast (line 336) | onSkillBeforeCast(message)
method determineCastKey (line 348) | determineCastKey(message)
method playSkillPlayerAnimation (line 362) | playSkillPlayerAnimation(ownerId, animationKey)
method onSkillAfterCast (line 402) | onSkillAfterCast(message)
method onSkillAttackApplyDamage (line 427) | onSkillAttackApplyDamage(message)
method getPlayDirection (line 468) | getPlayDirection(extraData, ownerSprite, currentPlayer, currentScene)
FILE: lib/actions/client/skills-ui.js
class SkillsUi (line 15) | class SkillsUi
method constructor (line 21) | constructor(uiScene)
method createUi (line 31) | createUi()
method appendSkills (line 46) | appendSkills(skills)
method appendToUiContainer (line 68) | appendToUiContainer(containerSelector, skillsUiTemplate, snippets = {})
method createUiBox (line 82) | createUiBox(codeName, depth)
method createSkillBox (line 94) | createSkillBox(skill)
method parseSkillTemplate (line 105) | parseSkillTemplate(skill)
FILE: lib/actions/factories/class-path-key-factory.js
class ClassPathKeyFactory (line 9) | class ClassPathKeyFactory
method fromLabel (line 16) | static fromLabel(label)
FILE: lib/actions/factories/skill-data-factory.js
class SkillDataFactory (line 15) | class SkillDataFactory
method constructor (line 18) | constructor()
method isValid (line 83) | isValid()
method mapData (line 94) | mapData(key, data, defaults)
method mapClassPaths (line 120) | mapClassPaths(data, defaults)
method mapObjects (line 150) | mapObjects(data, defaults)
method mapAnimations (line 167) | mapAnimations(key, data, defaults)
method mapOwnerConditions (line 189) | mapOwnerConditions(data, defaults)
method mapOwnerEffects (line 211) | mapOwnerEffects(data, defaults)
method mapTargetEffects (line 233) | mapTargetEffects(data, defaults)
method skillBaseData (line 254) | skillBaseData()
FILE: lib/actions/server/battle-end-action.js
class BattleEndAction (line 12) | class BattleEndAction
method constructor (line 21) | constructor(positionX, positionY, targetKey, lastAttackKey)
FILE: lib/actions/server/battle.js
class Battle (line 25) | class Battle
method constructor (line 31) | constructor(props)
method runBattle (line 59) | async runBattle(playerSchema, target)
method getCurrentAction (line 99) | getCurrentAction(playerSchema)
method setTimerOn (line 113) | setTimerOn(useTimerObj, target)
method updateTargetClient (line 134) | async updateTargetClient(targetClient, targetSchema, attackerId, room,...
method clientDeathUpdate (line 163) | async clientDeathUpdate(targetSchema, room, targetClient, affectedProp...
method revivePlayer (line 215) | async revivePlayer(room, body, targetSchema, affectedProperty, targetC...
FILE: lib/actions/server/data-loader.js
class DataLoader (line 17) | class DataLoader
method enrichConfig (line 26) | static async enrichConfig(configProcessor, skillsModelsManager, dataSe...
method prepareConfigProcessor (line 40) | static async prepareConfigProcessor(configProcessor)
method loadSkillsFullList (line 60) | static async loadSkillsFullList(configProcessor, skillsModelsManager)
method loadGroupsFullList (line 73) | static async loadGroupsFullList(configProcessor, dataServer)
method loadClassPathFullList (line 86) | static async loadClassPathFullList(configProcessor, skillsModelsManager)
method appendSkillsAnimations (line 99) | static async appendSkillsAnimations(config, dataServer)
method appendLevelsAnimations (line 128) | static async appendLevelsAnimations(config, dataServer)
method generateAnimationKey (line 157) | static generateAnimationKey(levelAnimation)
FILE: lib/actions/server/entities/operation-types-entity-override.js
class OperationTypesEntityOverride (line 11) | class OperationTypesEntityOverride extends OperationTypesEntity
method propertiesConfig (line 18) | static propertiesConfig(extraProps)
FILE: lib/actions/server/entities/skills-class-path-entity-override.js
class SkillsClassPathEntityOverride (line 11) | class SkillsClassPathEntityOverride extends SkillsClassPathEntity
method propertiesConfig (line 18) | static propertiesConfig(extraProps)
FILE: lib/actions/server/entities/skills-levels-modifiers-entity-override.js
class SkillsLevelsModifiersEntityOverride (line 14) | class SkillsLevelsModifiersEntityOverride extends SkillsLevelsModifiersE...
method propertiesConfig (line 21) | static propertiesConfig(extraProps)
FILE: lib/actions/server/entities/skills-levels-set-entity-override.js
class SkillsLevelsSetEntityOverride (line 11) | class SkillsLevelsSetEntityOverride extends SkillsLevelsSetEntity
method propertiesConfig (line 18) | static propertiesConfig(extraProps)
FILE: lib/actions/server/entities/skills-owners-class-path-entity-override.js
class SkillsOwnersClassPathEntityOverride (line 13) | class SkillsOwnersClassPathEntityOverride extends SkillsOwnersClassPathE...
method propertiesConfig (line 20) | static propertiesConfig(extraProps)
FILE: lib/actions/server/entities/skills-skill-animations-entity-override.js
class SkillsSkillAnimationsEntityOverride (line 13) | class SkillsSkillAnimationsEntityOverride extends SkillsSkillAnimationsE...
method propertiesConfig (line 20) | static propertiesConfig(extraProps)
FILE: lib/actions/server/entities/skills-skill-attack-entity-override.js
class SkillsSkillAttackEntityOverride (line 12) | class SkillsSkillAttackEntityOverride extends SkillsSkillAttackEntity
method propertiesConfig (line 19) | static propertiesConfig(extraProps)
FILE: lib/actions/server/entities/skills-skill-entity-override.js
class SkillsSkillEntityOverride (line 12) | class SkillsSkillEntityOverride extends SkillsSkillEntity
method propertiesConfig (line 19) | static propertiesConfig(extraProps)
FILE: lib/actions/server/entities/skills-skill-owner-effects-entity-override.js
class SkillsSkillOwnerEffectsEntityOverride (line 14) | class SkillsSkillOwnerEffectsEntityOverride extends SkillsSkillOwnerEffe...
method propertiesConfig (line 21) | static propertiesConfig(extraProps)
FILE: lib/actions/server/entities/skills-skill-target-effects-entity-override.js
class SkillsSkillTargetEffectsEntityOverride (line 14) | class SkillsSkillTargetEffectsEntityOverride extends SkillsSkillTargetEf...
method propertiesConfig (line 21) | static propertiesConfig(extraProps)
FILE: lib/actions/server/event-listeners.js
class EventListeners (line 15) | class EventListeners
method attachCastMovementEvents (line 25) | static async attachCastMovementEvents(props)
method validateSkillData (line 62) | static validateSkillData(skill)
FILE: lib/actions/server/events/battle-ended-event.js
class BattleEndedEvent (line 20) | class BattleEndedEvent
method constructor (line 26) | constructor(props)
FILE: lib/actions/server/events/player-death-event.js
class PlayerDeathEvent (line 20) | class PlayerDeathEvent
method constructor (line 26) | constructor(props)
FILE: lib/actions/server/initial-game-data-enricher.js
class InitialGameDataEnricher (line 12) | class InitialGameDataEnricher
method constructor (line 15) | constructor()
method withClassPathLabels (line 26) | async withClassPathLabels(roomGame, superInitialGameData)
FILE: lib/actions/server/message-actions.js
class ActionsMessageActions (line 19) | class ActionsMessageActions
method executeMessageActions (line 29) | async executeMessageActions(client, data, room, playerSchema)
method preparePlayerCurrentAction (line 68) | preparePlayerCurrentAction(playerSchema, data)
method validateTarget (line 93) | validateTarget(target, room)
FILE: lib/actions/server/models-manager.js
class ModelsManager (line 22) | class ModelsManager
method constructor (line 28) | constructor(props)
method getEntity (line 40) | getEntity(entityName)
method loadOwnerClassPath (line 57) | async loadOwnerClassPath(ownerId)
method updateLevel (line 70) | async updateLevel(levelsSet)
method updateExperience (line 83) | async updateExperience(levelsSet)
method generateSkillsDataFromModels (line 96) | async generateSkillsDataFromModels(skillsClasses)
method generateClassPathInstances (line 116) | async generateClassPathInstances(classPathClasses)
method prepareClassPathData (line 129) | async prepareClassPathData(owner, ownerIdProperty, classPathsListById,...
FILE: lib/actions/server/player-class-path-handler.js
class PlayerClassPathHandler (line 14) | class PlayerClassPathHandler
method createFromLoginData (line 25) | static async createFromLoginData(props)
FILE: lib/actions/server/player-enricher.js
class PlayerEnricher (line 29) | class PlayerEnricher
method constructor (line 35) | constructor(props)
method withClassPath (line 58) | async withClassPath(roomGame, superInitialGameData)
method withActions (line 81) | async withActions(currentPlayer, room)
method playerExecutePhysicalSkillCallback (line 101) | playerExecutePhysicalSkillCallback(currentPlayer, skillsAnimationsData)
method withSkillsServerAndClassPath (line 146) | async withSkillsServerAndClassPath(props)
FILE: lib/actions/server/plugin.js
class ActionsPlugin (line 23) | class ActionsPlugin extends PluginInterface
method setup (line 29) | setup(props)
method listenEvents (line 56) | listenEvents()
method serverReadyDataLoaderEnrichConfig (line 72) | async serverReadyDataLoaderEnrichConfig(event)
method enrichInitialGameDataWithClassPathData (line 82) | async enrichInitialGameDataWithClassPathData(superInitialGameData, roo...
method appendRoomActions (line 92) | async appendRoomActions(roomMessageActions)
method enrichPlayerWithSkillsAndActions (line 104) | async enrichPlayerWithSkillsAndActions(client, userModel, currentPlaye...
method createPlayerClassPath (line 129) | async createPlayerClassPath(player, loginData, loginManager)
FILE: lib/actions/server/pve.js
class Pve (line 19) | class Pve extends Battle
method constructor (line 25) | constructor(props)
method setTargetObject (line 41) | setTargetObject(targetObject)
method runBattle (line 52) | async runBattle(playerSchema, target, roomScene)
method startBattleWith (line 105) | async startBattleWith(playerSchema, room)
method pickRandomActionFromObject (line 182) | pickRandomActionFromObject()
method chasePlayer (line 195) | chasePlayer(playerSchema, room, objectAction)
method attackInRange (line 211) | async attackInRange(objectAction, playerSchema, room)
method startBattleWithDelay (line 249) | async startBattleWithDelay(playerSchema, room, objectAction)
method leaveBattle (line 267) | leaveBattle(playerSchema)
method moveObjectToOriginPoints (line 279) | moveObjectToOriginPoints()
method battleEnded (line 305) | async battleEnded(playerSchema, room)
method sendBattleEndedActionData (line 341) | sendBattleEndedActionData(room, playerSchema, actionData)
method removeInBattlePlayer (line 355) | removeInBattlePlayer(playerSchema)
FILE: lib/actions/server/pvp.js
class Pvp (line 17) | class Pvp extends Battle
method runBattle (line 26) | async runBattle(playerSchema, target, room)
method executeAction (line 60) | async executeAction(playerSchema, target)
FILE: lib/actions/server/skills-class-path-loader.js
class SkillsClassPathLoader (line 17) | class SkillsClassPathLoader
method constructor (line 23) | constructor(props)
method getEntity (line 33) | getEntity(entityName)
method loadFullPathData (line 49) | async loadFullPathData()
method loadClassPathsWithLevelsSet (line 66) | async loadClassPathsWithLevelsSet()
method loadLevelLabelsByClassPathIds (line 77) | async loadLevelLabelsByClassPathIds(classPathIds)
method loadLevelSkillsByClassPathIds (line 90) | async loadLevelSkillsByClassPathIds(classPathIds)
method extractSkillIds (line 103) | extractSkillIds(levelSkillsMap)
method loadSkillsWithRelations (line 122) | async loadSkillsWithRelations(skillIds)
method groupByClassPathId (line 144) | groupByClassPathId(items)
method indexById (line 164) | indexById(items)
method mapClassPathData (line 183) | mapClassPathData(classPathModels, levelLabelsMap, levelSkillsMap, skil...
method attachSkillsToLevelSkills (line 199) | attachSkillsToLevelSkills(levelSkills, skillsMap)
method sortLevelSkillsBySkillKey (line 209) | sortLevelSkillsBySkillKey(levelSkills)
FILE: lib/actions/server/skills-extra-data-mapper.js
class SkillsExtraDataMapper (line 16) | class SkillsExtraDataMapper
method constructor (line 19) | constructor()
method extractSkillExtraData (line 29) | extractSkillExtraData(params)
FILE: lib/actions/server/skills/type-attack.js
class TypeAttack (line 12) | class TypeAttack extends Attack
method constructor (line 17) | constructor(props)
method runSkillLogic (line 29) | async runSkillLogic()
FILE: lib/actions/server/skills/type-effect.js
class TypeEffect (line 12) | class TypeEffect extends Effect
method constructor (line 17) | constructor(props)
method runSkillLogic (line 29) | async runSkillLogic()
FILE: lib/actions/server/skills/type-physical-attack.js
class TypePhysicalAttack (line 12) | class TypePhysicalAttack extends PhysicalAttack
method constructor (line 18) | constructor(props)
method onHit (line 35) | async onHit(props)
method sendUpdateFromPvP (line 75) | async sendUpdateFromPvP(validDefender)
method startPvE (line 98) | async startPvE(validDefender)
method restartBattle (line 110) | async restartBattle(validDefender)
method executeBullets (line 129) | executeBullets(props)
method getValidDefender (line 150) | getValidDefender(props, defenderBodyKey)
method removeBullet (line 163) | removeBullet(body)
FILE: lib/actions/server/skills/type-physical-effect.js
class TypePhysicalEffect (line 12) | class TypePhysicalEffect extends PhysicalEffect
method constructor (line 18) | constructor(props)
method onHit (line 35) | async onHit(props)
method sendUpdateFromPvP (line 70) | async sendUpdateFromPvP(validDefender)
method startPvE (line 92) | async startPvE(validDefender)
method restartBattle (line 104) | async restartBattle(validDefender)
method executeBullets (line 123) | executeBullets(props)
method getValidDefender (line 144) | getValidDefender(props, defenderBodyKey)
method removeBullet (line 154) | removeBullet(body)
FILE: lib/actions/server/storage-observer.js
class StorageObserver (line 22) | class StorageObserver
method constructor (line 28) | constructor(props)
method registerListeners (line 48) | registerListeners()
method saveTargetData (line 89) | async saveTargetData(skill)
method saveOwnerData (line 101) | async saveOwnerData(skill)
method updateExperience (line 110) | async updateExperience(levelsSet)
method saveLevelUpData (line 119) | async saveLevelUpData(levelsSet)
FILE: lib/actions/server/storage/class-path-generator.js
class ClassPathGenerator (line 13) | class ClassPathGenerator
method fromClassPathModels (line 21) | static fromClassPathModels(classPathModels, classPathClasses)
method extractLabelsByLevels (line 47) | static extractLabelsByLevels(levelLabelsModel)
FILE: lib/actions/server/storage/conditions-generator.js
class ConditionsGenerator (line 12) | class ConditionsGenerator
method fromConditionsModels (line 19) | static fromConditionsModels(conditionsModels)
FILE: lib/actions/server/storage/levels-generator.js
class LevelsGenerator (line 13) | class LevelsGenerator
method fromLevelsModels (line 20) | static fromLevelsModels(levelsModels)
method extractModifiers (line 36) | static extractModifiers(modifiersModels)
FILE: lib/actions/server/storage/modifiers-generator.js
class ModifiersGenerator (line 12) | class ModifiersGenerator
method fromModifiersModels (line 19) | static fromModifiersModels(modifiersModels)
FILE: lib/actions/server/storage/skills-generator.js
class SkillsGenerator (line 16) | class SkillsGenerator
method dataFromSkillsModelsWithClasses (line 25) | static dataFromSkillsModelsWithClasses(skillsModels, skillsClasses, ev...
method skillsByLevelsFromSkillsModels (line 53) | static skillsByLevelsFromSkillsModels(levelSkillsModels, owner, ownerI...
method enrichWithPhysicalData (line 94) | static enrichWithPhysicalData(skillModel)
method enrichWithAttackData (line 114) | static enrichWithAttackData(skillModel)
FILE: lib/admin/server/plugin.js
class AdminPlugin (line 27) | class AdminPlugin extends PluginInterface
method setup (line 34) | async setup(setupServerProperties)
method listenEvents (line 52) | listenEvents()
method extendAdminTemplates (line 115) | extendAdminTemplates(event)
FILE: lib/admin/server/room-map-tilesets-validator.js
class RoomMapTilesetsValidator (line 16) | class RoomMapTilesetsValidator
method constructor (line 23) | constructor(dataServer, config)
method validate (line 34) | async validate(event)
method readMapFile (line 95) | readMapFile(mapBucket, mapFilename, roomId)
method extractTilesetImages (line 119) | extractTilesetImages(mapData)
method validateImagesExist (line 146) | validateImagesExist(tilesetImages, sceneImagesBucket, roomId, mapFilen...
method arraysAreEqual (line 168) | arraysAreEqual(array1, array2)
method overrideSceneImages (line 188) | async overrideSceneImages(roomId, tilesetImages)
method extractTilesetImagesFromEntity (line 205) | extractTilesetImagesFromEntity(entityData, driverResource)
FILE: lib/admin/server/rooms-file-upload-renderer.js
class RoomsFileUploadRenderer (line 9) | class RoomsFileUploadRenderer
method renderFileUploadField (line 12) | async renderFileUploadField(eventData)
FILE: lib/admin/server/subscribers/create-admin-subscriber.js
class CreateAdminSubscriber (line 26) | class CreateAdminSubscriber
method activateAdmin (line 33) | async activateAdmin(event)
method validate (line 82) | validate(serverManager)
method fetchConfigurations (line 107) | fetchConfigurations(config)
method fetchFilesContents (line 127) | async fetchFilesContents(themeManager)
FILE: lib/admin/server/subscribers/generators-routes-subscriber.js
class GeneratorsRoutesSubscriber (line 16) | class GeneratorsRoutesSubscriber
method constructor (line 24) | constructor(adminManager, projectGenerateDataPath, projectGeneratedDat...
method listenEvents (line 40) | listenEvents()
method setupRoutes (line 55) | setupRoutes(adminManager)
FILE: lib/admin/server/subscribers/maps-wizard-subscriber.js
class MapsWizardSubscriber (line 29) | class MapsWizardSubscriber
method constructor (line 37) | constructor(adminManager, configManager, themeManager)
method listenEvents (line 82) | listenEvents()
method setupRoutes (line 116) | setupRoutes(adminManager)
method generateMaps (line 147) | async generateMaps(req, res, adminManager)
method mapSubMapsData (line 273) | mapSubMapsData(generatedSubMaps, generators, tileWidth, tileHeight)
method mapsWizardRedirect (line 304) | mapsWizardRedirect(res, result)
method mapsWizardMapsSelection (line 315) | async mapsWizardMapsSelection(res, data, adminManager)
method importSelectedMaps (line 325) | async importSelectedMaps(req)
method mapGeneratedMapsDataForImport (line 343) | mapGeneratedMapsDataForImport(data)
FILE: lib/admin/server/subscribers/objects-importer-subscriber.js
class ObjectsImporterSubscriber (line 21) | class ObjectsImporterSubscriber
method constructor (line 28) | constructor(adminManager, themeManager)
method listenEvents (line 60) | listenEvents()
method setupRoutes (line 94) | setupRoutes(adminManager)
method importObjects (line 116) | async importObjects(req)
FILE: lib/admin/server/subscribers/rooms-entity-subscriber.js
class RoomsEntitySubscriber (line 23) | class RoomsEntitySubscriber
method constructor (line 30) | constructor(adminManager, config)
method setupRepositories (line 51) | setupRepositories()
method listenEvents (line 74) | listenEvents()
method setupRoomsSpecificRoutes (line 120) | setupRoomsSpecificRoutes(adminRouter, rootPath, viewPath, entityRoute,...
method roomsEntityExtraData (line 212) | async roomsEntityExtraData()
method populateEditFormTilesetImages (line 226) | populateEditFormTilesetImages(event)
FILE: lib/admin/server/subscribers/shutdown-subscriber.js
class ShutdownSubscriber (line 17) | class ShutdownSubscriber
method constructor (line 25) | constructor(adminManager, configManager, broadcastCallback)
method listenEvents (line 62) | listenEvents()
method fetchConfigurations (line 102) | fetchConfigurations()
method setupRoutes (line 115) | setupRoutes(adminManager)
method getShuttingDownData (line 185) | getShuttingDownData()
method broadcastShutdownMessage (line 208) | async broadcastShutdownMessage()
method broadcastSystemMessage (line 218) | async broadcastSystemMessage(message)
FILE: lib/admin/server/subscribers/skills-importer-subscriber.js
class SkillsImporterSubscriber (line 21) | class SkillsImporterSubscriber
method constructor (line 28) | constructor(adminManager, themeManager)
method listenEvents (line 60) | listenEvents()
method setupRoutes (line 94) | setupRoutes(adminManager)
method importSkills (line 116) | async importSkills(req)
FILE: lib/admin/server/subscribers/theme-manager-subscriber.js
class ThemeManagerSubscriber (line 20) | class ThemeManagerSubscriber
method constructor (line 28) | constructor(adminManager, configManager, themeManager)
method getCommandsMetadata (line 62) | getCommandsMetadata()
method listenEvents (line 183) | listenEvents()
method setupRoutes (line 232) | setupRoutes(adminManager)
method executeCommand (line 273) | async executeCommand(commandName, themeName)
method getAvailableThemes (line 290) | getAvailableThemes()
method getTemplateData (line 317) | getTemplateData(adminManager)
FILE: lib/ads/client/ads-provider.js
class AdsProvider (line 11) | class AdsProvider
method fetchActiveAdsByProviderId (line 20) | static fetchActiveAdsByProviderId(providerId, validAdsTypes, available...
FILE: lib/ads/client/messages-listener.js
class MessagesListener (line 16) | class MessagesListener
method listenMessages (line 24) | static async listenMessages(room, adsPlugin)
FILE: lib/ads/client/plugin.js
class AdsPlugin (line 27) | class AdsPlugin extends PluginInterface
method setup (line 33) | setup(props)
method setConfig (line 58) | setConfig()
method setSkdHandler (line 63) | setSkdHandler()
method fetchActiveProviders (line 73) | fetchActiveProviders()
method setTranslations (line 95) | setTranslations()
method listenEvents (line 106) | listenEvents()
FILE: lib/ads/client/providers/crazy-games.js
class CrazyGames (line 22) | class CrazyGames
method constructor (line 29) | constructor(providerModel, gameManager)
method fetchActiveAds (line 75) | fetchActiveAds(providerModel)
method validAdsTypes (line 90) | validAdsTypes()
method activate (line 98) | async activate()
method hasAdblock (line 130) | async hasAdblock()
method isEnabled (line 147) | async isEnabled()
method activateAds (line 155) | async activateAds()
FILE: lib/ads/client/providers/crazy-games/banners-handler.js
class BannersHandler (line 25) | class BannersHandler
method constructor (line 31) | constructor(props)
method availableBanners (line 56) | availableBanners()
method availableResponsiveBanners (line 70) | availableResponsiveBanners()
method validBannerSize (line 91) | validBannerSize(size)
method validResponsiveBannerSize (line 100) | validResponsiveBannerSize(size)
method activateAdBanner (line 109) | async activateAdBanner(activeAd)
method handleBannerType (line 167) | async handleBannerType(isResponsive, activeAd, bannerLocalStorageKey)
method createBanner (line 180) | async createBanner(activeAd, bannerLocalStorageKey)
method mapStylesWithValues (line 224) | mapStylesWithValues(activeAd)
method createResponsiveBanner (line 256) | async createResponsiveBanner(activeAd, bannerLocalStorageKey)
FILE: lib/ads/client/providers/crazy-games/validator.js
class Validator (line 11) | class Validator
method validate (line 18) | validate(props)
method canBeActivated (line 42) | async canBeActivated(props)
FILE: lib/ads/client/providers/crazy-games/videos-handler.js
class VideosHandler (line 23) | class VideosHandler
method constructor (line 29) | constructor(props)
method setConfig (line 50) | setConfig()
method activateAdVideo (line 72) | async activateAdVideo(activeAd)
method tryRePlay (line 100) | async tryRePlay(activeAd)
method send (line 144) | send(props)
FILE: lib/ads/client/providers/game-monetize.js
class GameMonetize (line 18) | class GameMonetize
method constructor (line 25) | constructor(providerModel, gameManager)
method fetchActiveAds (line 63) | fetchActiveAds(providerModel)
method eventKeys (line 78) | eventKeys()
method setSdkOptions (line 90) | setSdkOptions()
method setConfig (line 121) | setConfig()
method validAdsTypes (line 140) | validAdsTypes()
method adStartedCallback (line 149) | async adStartedCallback(event)
method adEndedCallback (line 165) | async adEndedCallback(event)
method sdkReadyCallback (line 181) | async sdkReadyCallback(event)
method activate (line 189) | async activate()
method activateAds (line 215) | async activateAds()
method tryRePlay (line 247) | async tryRePlay(activeAd)
method send (line 271) | send(props)
FILE: lib/ads/client/providers/google-ad-sense.js
class GoogleAdSense (line 14) | class GoogleAdSense
method constructor (line 21) | constructor(providerModel, gameManager)
FILE: lib/ads/client/sdk-handler.js
class SdkHandler (line 18) | class SdkHandler
method constructor (line 24) | constructor(props)
method setupProvidersSdk (line 35) | async setupProvidersSdk(providers, gameManager)
method appendSdk (line 62) | async appendSdk(provider)
method activateSdkInstance (line 81) | async activateSdkInstance(provider, gameManager)
FILE: lib/ads/server/ads-start-handler.js
class AdsStartHandler (line 24) | class AdsStartHandler
method initialize (line 31) | async initialize(props)
method loadData (line 55) | async loadData()
method mapProviders (line 86) | async mapProviders()
method mapTypes (line 102) | async mapTypes()
method enrichAds (line 118) | async enrichAds()
method instanceByType (line 131) | instanceByType(ad)
FILE: lib/ads/server/ads-type/banner.js
class Banner (line 21) | class Banner extends BaseAd
method fromModel (line 28) | static fromModel(adsModel)
method constructor (line 36) | constructor(adsModel)
method setBannerDataFromModel (line 46) | setBannerDataFromModel(adsModel)
method clientData (line 60) | clientData()
FILE: lib/ads/server/ads-type/base-ad.js
class BaseAd (line 11) | class BaseAd
method fromModel (line 18) | static fromModel(adsModel)
method constructor (line 26) | constructor(adsModel)
method setData (line 35) | setData(adsModel)
method clientData (line 63) | clientData()
FILE: lib/ads/server/ads-type/event-video.js
class EventVideo (line 21) | class EventVideo extends BaseAd
method fromModel (line 28) | static fromModel(adsModel)
method constructor (line 36) | constructor(adsModel)
method setVideoDataFromModel (line 46) | setVideoDataFromModel(adsModel)
method clientData (line 62) | clientData()
FILE: lib/ads/server/entities/ads-entity-override.js
class AdsEntityOverride (line 12) | class AdsEntityOverride extends AdsEntity
method propertiesConfig (line 19) | static propertiesConfig(extraProps)
FILE: lib/ads/server/event-handlers/create-player-ads-handler.js
class CreatePlayerAdsHandler (line 15) | class CreatePlayerAdsHandler
method constructor (line 21) | constructor(adsPlugin)
method enrichPlayedWithPlayedAds (line 34) | async enrichPlayedWithPlayedAds(playerSchema, client)
FILE: lib/ads/server/message-actions.js
class AdsMessageActions (line 24) | class AdsMessageActions
method constructor (line 30) | constructor(props)
method setRepository (line 50) | setRepository()
method loadPlayedAd (line 64) | async loadPlayedAd(playerId, adId)
method upsertPlayedAd (line 79) | async upsertPlayedAd(playerId, adId, startedAt = null, endedAt = null)
method executeMessageActions (line 110) | async executeMessageActions(client, data, room, playerSchema)
method adStart (line 126) | async adStart(data, room, playerSchema)
method adEnded (line 145) | async adEnded(data, room, playerSchema)
method giveRewardItem (line 181) | async giveRewardItem(playerSchema, playedAd)
FILE: lib/ads/server/plugin.js
class AdsPlugin (line 25) | class AdsPlugin extends PluginInterface
method setup (line 31) | setup(props)
method listenEvents (line 53) | listenEvents()
FILE: lib/audio/client/audio-ui.js
class AudioUi (line 19) | class AudioUi
method constructor (line 25) | constructor(uiScene)
method createUi (line 40) | createUi()
method prepareAudioSettingsContent (line 67) | prepareAudioSettingsContent(audioCategoryTemplate, audioSettingsTemplate)
method prepareCategoriesRows (line 83) | prepareCategoriesRows(audioCategoryTemplate)
FILE: lib/audio/client/audio-update.js
class AudioUpdate (line 12) | class AudioUpdate
method constructor (line 19) | constructor(updateType, updateValue)
FILE: lib/audio/client/manager.js
class AudioManager (line 26) | class AudioManager
method constructor (line 32) | constructor(props)
method setAudio (line 74) | async setAudio(audioKey, enabled)
method setAudioForSingleEntity (line 107) | setAudioForSingleEntity(playingElement, playOrStop, audioKey, enabled)
method setAudioForElementChildren (line 136) | setAudioForElementChildren(playingElement, category, enabled)
method generateAudio (line 157) | generateAudio(onScene, audio)
method findAudio (line 184) | findAudio(audioKey, sceneKey)
method findRoomAudio (line 194) | findRoomAudio(audioKey, sceneKey)
method findGlobalAudio (line 206) | findGlobalAudio(audioKey)
method findAudioInObjectKey (line 216) | findAudioInObjectKey(audioKey, audiosObject)
method addCategories (line 237) | addCategories(categories)
method loadGlobalAudios (line 254) | async loadGlobalAudios(audios, currentScene)
method loadAudiosInScene (line 268) | async loadAudiosInScene(audios, currentScene)
method loadByKeys (line 287) | async loadByKeys(audioKeys, audios, currentScene, storageKey)
method existsFileByXMLHttpRequest (line 324) | async existsFileByXMLHttpRequest(url)
method prepareFiles (line 339) | async prepareFiles(audio)
method fireAudioEvents (line 361) | async fireAudioEvents(audios, currentScene, audio, newAudiosCounter)
method removeAudiosFromScene (line 374) | removeAudiosFromScene(audios, currentScene)
method removeSceneAudioByAudioKey (line 389) | removeSceneAudioByAudioKey(scene, audioKey)
method updateDefaultConfig (line 406) | updateDefaultConfig(defaultAudioConfig)
method processUpdateData (line 419) | async processUpdateData(message, room, gameManager)
method processDeleteData (line 442) | async processDeleteData(message, room, gameManager)
method destroySceneAudios (line 455) | destroySceneAudios()
method changeMuteState (line 489) | async changeMuteState(newMuteState, newMuteLockState)
method muteCategories (line 506) | async muteCategories(newMuteLockState)
method restoreMute (line 525) | async restoreMute(newMuteLockState)
method setMuteLock (line 543) | setMuteLock(newMuteLockState)
FILE: lib/audio/client/messages-listener.js
class MessagesListener (line 15) | class MessagesListener
method constructor (line 18) | constructor()
method listenMessages (line 30) | listenMessages(room, gameManager)
method processQueue (line 40) | async processQueue()
method processMessage (line 61) | async processMessage(message, room, gameManager)
FILE: lib/audio/client/plugin.js
class AudioPlugin (line 23) | class AudioPlugin extends PluginInterface
method setup (line 31) | setup(props)
method setTranslations (line 56) | setTranslations()
method listenEvents (line 67) | listenEvents()
method initializeAudioManager (line 115) | initializeAudioManager(gameManager)
FILE: lib/audio/client/scene-audio-player.js
class SceneAudioPlayer (line 17) | class SceneAudioPlayer
method playSceneAudio (line 26) | playSceneAudio(audioManager, sceneDynamic, forcePlay)
method associateSceneAnimationsAudios (line 47) | associateSceneAnimationsAudios(audioManager, sceneDynamic)
method attachAudioToSprite (line 108) | attachAudioToSprite(sprite, animationAudioKey, audioManager, sceneDyna...
method playSpriteAudio (line 129) | playSpriteAudio(associatedAudio, sceneDynamic, sprite, audioManager)
method isCurrentPlayerSprite (line 209) | isCurrentPlayerSprite(spritePlayerId, currentPlayerId)
method isMutedState (line 220) | isMutedState(audioManager, mutedKey, audioInstance)
FILE: lib/audio/server/audio-hot-plug-callbacks.js
class AudioHotPlugCallbacks (line 12) | class AudioHotPlugCallbacks
method beforeDeleteCallback (line 21) | static beforeDeleteCallback(projectConfig, bucket, distFolder)
method beforeUpdateCallback (line 37) | static beforeUpdateCallback(projectConfig, bucket, distFolder)
method afterUpdateCallback (line 56) | static afterUpdateCallback(projectConfig, bucket, distFolder)
method updateAudio (line 81) | static async updateAudio(params, bucket, model, distFolder, projectCon...
method removeAudio (line 103) | static async removeAudio(distFolder, bucket, model, projectConfig, id,...
FILE: lib/audio/server/entities/audio-entity-override.js
class AudioEntityOverride (line 15) | class AudioEntityOverride extends AudioEntity
method propertiesConfig (line 23) | static propertiesConfig(extraProps, projectConfig)
FILE: lib/audio/server/manager.js
class AudioManager (line 20) | class AudioManager
method constructor (line 26) | constructor(props)
method setRepositories (line 44) | setRepositories()
method loadAudioCategories (line 58) | async loadAudioCategories()
method loadGlobalAudios (line 67) | async loadGlobalAudios()
method convertAudiosConfigJsonToObjects (line 86) | convertAudiosConfigJsonToObjects(loadedGlobalAudios)
method loadRoomAudios (line 113) | async loadRoomAudios(roomId)
method loadAudioPlayerConfig (line 132) | async loadAudioPlayerConfig(playerId)
method executeMessageActions (line 152) | async executeMessageActions(client, message, room)
method hotPlugAudio (line 181) | hotPlugAudio(options)
method hotPlugRoomAudio (line 193) | hotPlugRoomAudio(newAudioModel)
method hotPlugGlobalAudio (line 213) | hotPlugGlobalAudio(newAudioModel)
method hotUnplugAudio (line 236) | hotUnplugAudio(props)
method hotUnplugRoomAudio (line 250) | hotUnplugRoomAudio(newAudioModel, id)
method hotUnplugGlobalAudio (line 274) | hotUnplugGlobalAudio(newAudioModel, id)
method findRoom (line 298) | findRoom(roomId, instancesList = {})
FILE: lib/audio/server/plugin.js
class AudioPlugin (line 17) | class AudioPlugin extends PluginInterface
method constructor (line 20) | constructor()
method setup (line 32) | setup(props)
FILE: lib/chat/cleaner.js
class Cleaner (line 11) | class Cleaner
method cleanMessage (line 19) | cleanMessage(message, characterLimit)
FILE: lib/chat/client/chat-tabs.js
class ChatTabs (line 16) | class ChatTabs
method constructor (line 23) | constructor(gameManager, uiScene)
method createTabs (line 44) | createTabs()
method fetchTemplates (line 100) | fetchTemplates()
method isReady (line 123) | isReady()
method activateTabs (line 134) | activateTabs()
FILE: lib/chat/client/chat-ui.js
class ChatUi (line 21) | class ChatUi
method constructor (line 27) | constructor(uiScene)
method setChatConfiguration (line 54) | setChatConfiguration()
method setChatTypes (line 76) | setChatTypes()
method createUi (line 103) | createUi()
method createTabs (line 135) | createTabs()
method setupOverheadChatEvents (line 144) | setupOverheadChatEvents()
method setupOpenCloseButtons (line 151) | setupOpenCloseButtons()
method setupSendButton (line 184) | setupSendButton()
method setupKeyPressBehaviors (line 194) | setupKeyPressBehaviors()
method showOverheadChat (line 223) | showOverheadChat(playerSprite, message)
method updateOverheadTextPosition (line 252) | updateOverheadTextPosition(playerSprite)
method destroyTextSprite (line 271) | destroyTextSprite(playerSprite)
method showIsTyping (line 283) | showIsTyping()
method hideIsTyping (line 303) | hideIsTyping()
method isFocussedOnChatInput (line 314) | isFocussedOnChatInput()
method showChatBox (line 319) | showChatBox()
method hideChatBox (line 335) | hideChatBox()
method showNotificationBalloon (line 347) | showNotificationBalloon()
method hideNotificationsBalloon (line 352) | hideNotificationsBalloon()
method getActiveBalloon (line 360) | getActiveBalloon()
method processMessagesQueue (line 376) | processMessagesQueue(messages)
method attachNewMessage (line 389) | attachNewMessage(message)
method appendWithScroll (line 467) | appendWithScroll(appendTo, output)
method translateFrom (line 477) | translateFrom(message)
method translateMessage (line 491) | translateMessage(message)
method t (line 521) | t(snippetKey, params = {}, activeLocale = false)
method isValidMessageType (line 530) | isValidMessageType(messageType)
method validMessageTypes (line 538) | validMessageTypes()
method isValidSnippetType (line 547) | isValidSnippetType(messageType)
method snippetsMessageTypes (line 563) | snippetsMessageTypes()
method isValidSnippetFromType (line 577) | isValidSnippetFromType(from)
method fetchPlayerByName (line 586) | fetchPlayerByName(playerName)
method sendChatMessage (line 604) | sendChatMessage()
method applyTextLimit (line 630) | applyTextLimit(text, limit)
method useGlobalRoom (line 639) | useGlobalRoom()
method isValidMessage (line 647) | isValidMessage()
method useGlobalRoomForMessage (line 657) | useGlobalRoomForMessage(message)
method sendPrivateMessage (line 677) | sendPrivateMessage(message, globalChat)
method globalSend (line 691) | globalSend(globalChat, message)
FILE: lib/chat/client/messages-listener.js
class MessagesListener (line 14) | class MessagesListener
method listenMessages (line 22) | static async listenMessages(room, chatPack)
FILE: lib/chat/client/plugin.js
class ChatPlugin (line 22) | class ChatPlugin extends PluginInterface
method setup (line 30) | async setup(props)
method setTranslations (line 55) | setTranslations()
method listenEvents (line 66) | listenEvents()
FILE: lib/chat/client/templates-handler.js
class TemplatesHandler (line 12) | class TemplatesHandler
method preloadTemplates (line 19) | static preloadTemplates(preloadScene, showTabs)
FILE: lib/chat/message-factory.js
class MessageFactory (line 13) | class MessageFactory
method create (line 24) | static create(type, message, messageData = {}, from, to)
method withDataToJson (line 56) | static withDataToJson(message, messageData = {})
FILE: lib/chat/server/entities/chat-entity-override.js
class ChatEntityOverride (line 11) | class ChatEntityOverride extends ChatEntity
method propertiesConfig (line 18) | static propertiesConfig(extraProps)
method updateProperty (line 37) | static updateProperty(config, propertyName, propertyField, propertyValue)
FILE: lib/chat/server/entities/chat-message-types-entity-override.js
class ChatMessageTypesEntityOverride (line 11) | class ChatMessageTypesEntityOverride extends ChatMessageTypesEntity
method propertiesConfig (line 18) | static propertiesConfig(extraProps)
FILE: lib/chat/server/event-listener/guest-invalid-change-point.js
class GuestInvalidChangePoint (line 13) | class GuestInvalidChangePoint
method sendMessage (line 21) | async sendMessage(event, chatManager)
FILE: lib/chat/server/event-listener/npc-skills.js
class NpcSkills (line 15) | class NpcSkills
method listenEvents (line 23) | static listenEvents(props, chatConfig, chatManager)
method listenDamageEvent (line 38) | static listenDamageEvent(attackSkill, chatConfig, chatManager)
method listenModifiersEvent (line 62) | static listenModifiersEvent(effectSkill, chatConfig, chatManager)
method listenAfterRunLogicEvent (line 83) | static listenAfterRunLogicEvent(skillForLogic, chatConfig, chatManager)
method fetchSkillsByType (line 107) | static fetchSkillsByType(props, chatConfig)
FILE: lib/chat/server/event-listener/player-skills.js
class PlayerSkills (line 14) | class PlayerSkills
method listenEvents (line 22) | static listenEvents(classPath, chatConfig, chatManager)
method listenDamageEvent (line 34) | static listenDamageEvent(chatConfig, classPath, chatManager)
method listenModifiersEvent (line 63) | static listenModifiersEvent(chatConfig, classPath, chatManager)
method listenAfterRunLogicEvent (line 87) | static listenAfterRunLogicEvent(chatConfig, classPath, chatManager)
FILE: lib/chat/server/manager.js
class ChatManager (line 12) | class ChatManager
method constructor (line 18) | constructor(props)
method saveMessage (line 34) | async saveMessage(message, playerId, roomId, clientToPlayerSchema, mes...
FILE: lib/chat/server/message-actions.js
class ChatMessageActions (line 21) | class ChatMessageActions
method constructor (line 27) | constructor(props)
method executeMessageActions (line 44) | async executeMessageActions(client, data, room, playerSchema)
method clientJoinAction (line 56) | async clientJoinAction(data, room, playerSchema)
method chatAction (line 95) | async chatAction(data, room, playerSchema)
FILE: lib/chat/server/messages-guard.js
class MessagesGuard (line 13) | class MessagesGuard
method validate (line 20) | static validate(message)
FILE: lib/chat/server/messages/message-data-mapper.js
class MessageDataMapper (line 12) | class MessageDataMapper
method mapMessageWithData (line 19) | static mapMessageWithData(skill)
FILE: lib/chat/server/messages/npc-damage-callback.js
class NpcDamageCallback (line 14) | class NpcDamageCallback
method sendMessage (line 21) | static async sendMessage(props)
FILE: lib/chat/server/messages/npc-dodge-callback.js
class NpcDodgeCallback (line 14) | class NpcDodgeCallback
method sendMessage (line 21) | static async sendMessage(props)
FILE: lib/chat/server/messages/npc-modifiers-callback.js
class NpcModifiersCallback (line 15) | class NpcModifiersCallback
method sendMessage (line 22) | static async sendMessage(props)
FILE: lib/chat/server/messages/player-damage-callback.js
class PlayerDamageCallback (line 14) | class PlayerDamageCallback
method sendMessage (line 21) | static async sendMessage(props)
FILE: lib/chat/server/messages/player-dodge-callback.js
class PlayerDodgeCallback (line 14) | class PlayerDodgeCallback
method sendMessage (line 21) | static async sendMessage(props)
FILE: lib/chat/server/messages/player-modifiers-callback.js
class PlayerModifiersCallback (line 15) | class PlayerModifiersCallback
method sendMessage (line 22) | static async sendMessage(props)
FILE: lib/chat/server/messages/validator.js
class Validator (line 11) | class Validator
method validateMessage (line 19) | static validateMessage(message, props)
FILE: lib/chat/server/plugin.js
class ChatPlugin (line 22) | class ChatPlugin extends PluginInterface
method setup (line 30) | async setup(props)
method listenEvents (line 56) | listenEvents()
FILE: lib/chat/server/room-chat.js
class RoomChat (line 20) | class RoomChat extends RoomLogin
method onCreate (line 26) | onCreate(props)
method onJoin (line 44) | onJoin(client, props, userModel)
method handleReceivedMessage (line 54) | async handleReceivedMessage(client, data)
method sendPrivateMessage (line 91) | async sendPrivateMessage(client, toPlayer, text, activePlayer)
method sendGlobalMessage (line 147) | async sendGlobalMessage(client, text, activePlayer)
method onLeave (line 186) | async onLeave(client, consented)
method broadcastLeaveMessage (line 196) | broadcastLeaveMessage(sessionId)
FILE: lib/config/client/config-manager.js
class ConfigManager (line 11) | class ConfigManager extends ConfigProcessor
method constructor (line 14) | constructor()
FILE: lib/config/processor.js
class ConfigProcessor (line 11) | class ConfigProcessor
method constructor (line 14) | constructor()
method get (line 25) | get(path, defaultValue)
method getWithoutLogs (line 54) | getWithoutLogs(path, defaultValue = false)
FILE: lib/config/server/entities/config-entity-override.js
class ConfigEntityOverride (line 11) | class ConfigEntityOverride extends ConfigEntity
method propertiesConfig (line 18) | static propertiesConfig(extraProps)
FILE: lib/config/server/entities/config-types-entity-override.js
class ConfigTypesEntityOverride (line 11) | class ConfigTypesEntityOverride extends ConfigTypesEntity
method propertiesConfig (line 18) | static propertiesConfig(extraProps)
FILE: lib/config/server/manager.js
class ConfigManager (line 22) | class ConfigManager extends ConfigProcessor
method constructor (line 28) | constructor(props)
method loadConfigurations (line 46) | async loadConfigurations()
method loopObjectAndAssignProperty (line 82) | loopObjectAndAssignProperty(configList, pathSplit, parsedValue)
method getParsedValue (line 100) | async getParsedValue(config)
FILE: lib/features/client/manager.js
class FeaturesManager (line 16) | class FeaturesManager
method constructor (line 22) | constructor(props)
method loadFeatures (line 36) | async loadFeatures(featuresCodeList)
FILE: lib/features/plugin-interface.js
class PluginInterface (line 11) | class PluginInterface
method setup (line 24) | async setup(props)
FILE: lib/features/server/entities/features-entity-override.js
class FeaturesEntityOverride (line 11) | class FeaturesEntityOverride extends FeaturesEntity
method propertiesConfig (line 18) | static propertiesConfig(extraProps)
FILE: lib/features/server/entities/features-entity.js
class FeaturesEntity (line 11) | class FeaturesEntity extends EntityProperties
method propertiesConfig (line 18) | static propertiesConfig(extraProps)
FILE: lib/features/server/manager.js
class FeaturesManager (line 19) | class FeaturesManager
method constructor (line 25) | constructor(props)
method loadFeatures (line 46) | async loadFeatures()
FILE: lib/features/server/setup-server-properties.js
class SetupServerProperties (line 19) | class SetupServerProperties extends PropertiesHandler
method constructor (line 25) | constructor(props)
FILE: lib/firebase/client/connector.js
class FirebaseConnector (line 27) | class FirebaseConnector
method constructor (line 33) | constructor(gameManager)
method fetchDefaultProviders (line 68) | fetchDefaultProviders()
method startFirebase (line 86) | startFirebase()
method activateLoginBehavior (line 120) | activateLoginBehavior(firebaseLogin)
method setupAuthButtons (line 145) | setupAuthButtons(providersKeys)
method createAuthButton (line 178) | createAuthButton(provider, text)
method signInWithProvider (line 190) | signInWithProvider(providerAuthMethod)
method setActiveUser (line 207) | setActiveUser(user)
method initAuth (line 230) | initAuth(firebaseConfig)
FILE: lib/firebase/server/plugin.js
class FirebasePlugin (line 24) | class FirebasePlugin extends PluginInterface
method setup (line 31) | async setup(props)
method listenEvents (line 41) | listenEvents() {
method mapConfiguration (line 51) | mapConfiguration()
method declareFirebaseConfigRequestHandler (line 87) | declareFirebaseConfigRequestHandler(app)
method firebaseConfig (line 97) | firebaseConfig()
FILE: lib/game/client/animations-defaults-merger.js
class AnimationsDefaultsMerger (line 16) | class AnimationsDefaultsMerger
method mergeDefaults (line 23) | static mergeDefaults(roomData)
FILE: lib/game/client/communication/room-state-entities-manager.js
class RoomStateEntitiesManager (line 13) | class RoomStateEntitiesManager
method onEntityAddWithProperties (line 16) | static onEntityAddWithProperties(room, collectionName, properties, onA...
method onEntityAddWithPropertyCallbacks (line 29) | static onEntityAddWithPropertyCallbacks(room, collectionName, property...
method onEntityAdd (line 47) | static onEntityAdd(room, collectionName, callback)
method onEntityRemove (line 52) | static onEntityRemove(room, collectionName, callback)
method createManager (line 57) | static createManager(room)
method _onCollectionEvent (line 62) | static _onCollectionEvent(room, collectionName, eventType, callback)
FILE: lib/game/client/communication/state-callbacks-manager.js
class StateCallbacksManager (line 14) | class StateCallbacksManager
method constructor (line 17) | constructor(room)
method wrap (line 24) | wrap(schemaObject)
method onAdd (line 29) | onAdd(collection, callback)
method onRemove (line 38) | onRemove(collection, callback)
method onChange (line 47) | onChange(collection, callback)
method listen (line 56) | listen(entity, propertyName, callback)
method listenAll (line 66) | listenAll(entity, properties, callback)
method dispose (line 75) | dispose()
FILE: lib/game/client/engine/sprite-text-factory.js
class SpriteTextFactory (line 18) | class SpriteTextFactory
method attachTextToSprite (line 30) | static attachTextToSprite(sprite, text, textConfig, topOff, textKeyWor...
method getTextPosition (line 63) | static getTextPosition(sprite, text, textConfig, topOff = 0)
FILE: lib/game/client/fps-counter.js
class FPSCounter (line 14) | class FPSCounter
method constructor (line 20) | constructor(gameDom)
method updateFPS (line 35) | updateFPS()
method start (line 48) | start()
FILE: lib/game/client/game-client.js
class GameClient (line 25) | class GameClient
method constructor (line 32) | constructor(serverUrl, config)
method joinOrCreate (line 67) | async joinOrCreate(roomName, options)
method connectToGlobalGameRoom (line 98) | async connectToGlobalGameRoom(roomUrl, client, options)
method connectToGlobalFeaturesRooms (line 122) | async connectToGlobalFeaturesRooms(roomUrl, client, options)
method roomClient (line 150) | roomClient(roomName)
FILE: lib/game/client/game-dom.js
class GameDom (line 14) | class GameDom
method constructor (line 17) | constructor()
method getWindow (line 33) | getWindow()
method getDocument (line 41) | getDocument()
method getElement (line 51) | getElement(querySelector, container = false)
method getElements (line 64) | getElements(querySelector, container)
method emptyElement (line 76) | emptyElement(querySelector, container = false)
method appendToElement (line 89) | appendToElement(querySelector, newContent)
method updateContent (line 108) | updateContent(querySelector, newContent)
method removeElement (line 121) | removeElement(querySelector)
method createElement (line 132) | createElement(type, id = '', classNamesList)
method setElementStyles (line 151) | setElementStyles(element, styles)
method createElementWithStyles (line 174) | createElementWithStyles(type, id = '', styles = {})
method activeElement (line 184) | activeElement()
method insideInput (line 192) | insideInput()
method getJSON (line 201) | getJSON(url, callback)
method alertReload (line 217) | alertReload(message)
FILE: lib/game/client/game-engine.js
class GameEngine (line 38) | class GameEngine extends Game
method constructor (line 44) | constructor(props)
method parseTemplate (line 71) | parseTemplate(template, view, partials, tags)
method updateGameSize (line 79) | updateGameSize(manager)
method getCurrentScreenSize (line 112) | getCurrentScreenSize(manager)
method centerSmallMapsCamera (line 153) | centerSmallMapsCamera(manager, activeScene, newWidth, mapWidth, newHei...
method showTarget (line 174) | showTarget(targetName, target, previousTarget)
method targetDisplay (line 188) | targetDisplay(targetName, target)
method generateTargetPlayedTime (line 201) | generateTargetPlayedTime(target)
method createPlayedTimeLabel (line 223) | createPlayedTimeLabel(playedTime)
method obtainPlayedTime (line 238) | obtainPlayedTime(target, currentPlayer)
method clearTarget (line 243) | clearTarget()
method setupTabTarget (line 259) | setupTabTarget(sceneDynamic)
method tabTarget (line 270) | tabTarget()
method showFPS (line 303) | showFPS()
FILE: lib/game/client/game-manager.js
class GameManager (line 44) | class GameManager
method constructor (line 47) | constructor()
method setChangingScene (line 99) | setChangingScene(changingScene)
method setupCustomClientPlugin (line 117) | setupCustomClientPlugin(customPluginKey, customPlugin)
method clientStart (line 123) | clientStart()
method startGame (line 136) | async startGame(formData, isNewUser)
method handleLoginSuccess (line 148) | handleLoginSuccess()
method handleLoginError (line 160) | handleLoginError(formData)
method joinGame (line 180) | async joinGame(formData, isNewUser = false)
method mapFormDataToUserData (line 203) | mapFormDataToUserData(formData, isNewUser)
method handleGameRoomMessages (line 222) | handleGameRoomMessages()
method activateResponsiveBehavior (line 246) | activateResponsiveBehavior()
method displayFormError (line 264) | displayFormError(formId, message)
method initializeClient (line 278) | initializeClient()
method beforeStartGame (line 289) | async beforeStartGame()
method initEngine (line 309) | async initEngine()
method joinFeaturesRooms (line 368) | async joinFeaturesRooms()
method reconnectGameClient (line 407) | async reconnectGameClient(message, previousRoom)
method emitActivatedRoom (line 433) | async emitActivatedRoom(sceneRoom, playerScene)
method emitJoinedRoom (line 444) | async emitJoinedRoom(sceneRoom, playerScene)
method createRoomEventsInstance (line 454) | createRoomEventsInstance(roomName)
method getAppServerUrl (line 462) | getAppServerUrl()
method getGameServerUrl (line 473) | getGameServerUrl()
method getUrlFromCurrentReferer (line 485) | getUrlFromCurrentReferer(useWebSocket = false)
method getActiveScene (line 498) | getActiveScene()
method getActiveScenePreloader (line 506) | getActiveScenePreloader()
method getCurrentPlayer (line 514) | getCurrentPlayer()
method currentPlayerName (line 527) | currentPlayerName()
method getCurrentPlayerAnimation (line 539) | getCurrentPlayerAnimation()
method getUiElement (line 550) | getUiElement(uiName, logError = true)
method getFeature (line 566) | getFeature(featureKey)
method getAnimationByKey (line 580) | getAnimationByKey(key)
FILE: lib/game/client/handlers/client-start-handler.js
class ClientStartHandler (line 18) | class ClientStartHandler
method constructor (line 24) | constructor(gameManager)
method clientStart (line 30) | clientStart()
FILE: lib/game/client/handlers/errors-block-handler.js
class ErrorsBlockHandler (line 12) | class ErrorsBlockHandler
method reset (line 19) | static reset(form)
FILE: lib/game/client/handlers/forgot-password-form-handler.js
class ForgotPasswordFormHandler (line 16) | class ForgotPasswordFormHandler
method constructor (line 22) | constructor(gameManager)
method activateForgotPassword (line 32) | activateForgotPassword()
method displayForgotPassword (line 59) | displayForgotPassword()
FILE: lib/game/client/handlers/full-screen-handler.js
class FullScreenHandler (line 15) | class FullScreenHandler
method constructor (line 21) | constructor(gameManager)
method activateFullScreen (line 28) | activateFullScreen()
method goFullScreen (line 52) | goFullScreen()
method exitFullScreen (line 61) | exitFullScreen()
FILE: lib/game/client/handlers/guest-form-handler.js
class GuestFormHandler (line 18) | class GuestFormHandler
method constructor (line 24) | constructor(gameManager)
method activateGuest (line 34) | activateGuest()
FILE: lib/game/client/handlers/login-form-handler.js
class LoginFormHandler (line 16) | class LoginFormHandler
method constructor (line 22) | constructor(gameManager)
method activateLogin (line 31) | activateLogin()
FILE: lib/game/client/handlers/registration-form-handler.js
class RegistrationFormHandler (line 17) | class RegistrationFormHandler
method constructor (line 23) | constructor(gameManager)
method activateRegistration (line 33) | activateRegistration()
FILE: lib/game/client/handlers/terms-and-conditions-handler.js
class TermsAndConditionsHandler (line 16) | class TermsAndConditionsHandler
method constructor (line 22) | constructor(gameManager)
method createOverlay (line 30) | createOverlay()
method showOverlay (line 41) | showOverlay()
method hideOverlay (line 49) | hideOverlay()
method activateTermsAndConditions (line 60) | activateTermsAndConditions()
FILE: lib/game/client/instructions-ui.js
class InstructionsUi (line 19) | class InstructionsUi
method createInstructions (line 27) | createInstructions(instConfig, uiScene)
FILE: lib/game/client/joystick.js
class Joystick (line 23) | class Joystick
method constructor (line 27) | constructor(props)
method registerJoystickController (line 56) | registerJoystickController()
method position (line 90) | position(value)
method applyMovement (line 99) | applyMovement(clientX, clientY)
method handleStop (line 108) | handleStop()
method updateDirection (line 121) | updateDirection(x, y)
method updateThumbPosition (line 162) | updateThumbPosition(x, y)
method handleMouseMove (line 185) | handleMouseMove(event)
method handleTouchMove (line 201) | handleTouchMove(event)
FILE: lib/game/client/minimap-ui.js
class MinimapUi (line 20) | class MinimapUi
method createMinimap (line 27) | createMinimap(minimapConfig, scenePreloader)
method showMap (line 65) | showMap(minimap, scenePreloader, openButton, closeButton, box)
method hideMap (line 86) | hideMap(minimap, scenePreloader, closeButton, box)
method awaitForCamera (line 108) | awaitForCamera(minimap)
FILE: lib/game/client/minimap.js
class Minimap (line 23) | class Minimap
method constructor (line 27) | constructor(props)
method createMap (line 39) | createMap(scene, playerSprite)
method createMinimapCamera (line 65) | createMinimapCamera(scene, playerSprite)
method createRoundMap (line 89) | createRoundMap(scene)
method addMinimapCircle (line 104) | addMinimapCircle(scene)
method createRoundCamera (line 128) | createRoundCamera(scene)
method destroyMap (line 139) | destroyMap()
FILE: lib/game/client/room-events.js
class RoomEvents (line 30) | class RoomEvents
method constructor (line 37) | constructor(roomName, gameManager)
method activateRoom (line 83) | async activateRoom(room, previousScene = false)
method listenPlayerAndStateChanges (line 115) | listenPlayerAndStateChanges(player, key)
method checkAndCreateScene (line 143) | checkAndCreateScene()
method playersOnAdd (line 166) | async playersOnAdd(player, key, previousScene)
method isCurrentPlayer (line 188) | isCurrentPlayer(key)
method addOtherPlayers (line 199) | addOtherPlayers(player, key, addPlayerData)
method createCurrentPlayer (line 219) | async createCurrentPlayer(player, previousScene, key)
method isValidScene (line 241) | isValidScene(currentScene, player)
method playersOnChange (line 251) | playersOnChange(player, key, from)
method playersOnRemove (line 279) | playersOnRemove(player, key)
method removePlayerByKey (line 291) | removePlayerByKey(key)
method gameOverReload (line 303) | gameOverReload()
method playerExists (line 317) | playerExists(currentScene, key)
method roomOnMessage (line 326) | async roomOnMessage(message)
method runInitUi (line 343) | async runInitUi(message)
method closeBox (line 358) | async closeBox(message)
method runCustomMessageListener (line 376) | async runCustomMessageListener(message)
method runUpdateStats (line 404) | async runUpdateStats(message)
method runReconnect (line 417) | async runReconnect(message)
method runChangingScene (line 429) | async runChangingScene(message)
method runChangedScene (line 443) | async runChangedScene(message)
method closeAllActiveDialogs (line 463) | closeAllActiveDialogs()
method runRevived (line 481) | async runRevived(message)
method runGameOver (line 503) | async runGameOver(message)
method showGameOverBox (line 537) | showGameOverBox()
method hideGameOverBox (line 545) | hideGameOverBox()
method displayGameOverBox (line 554) | displayGameOverBox(display)
method roomOnLeave (line 573) | async roomOnLeave(code)
method isAbnormalShutdown (line 596) | isAbnormalShutdown(code)
method updatePlayerStats (line 605) | async updatePlayerStats(message)
method updateStatsPanel (line 624) | updateStatsPanel(message)
method initUi (line 648) | initUi(props)
method uiSetTitleAndContent (line 672) | uiSetTitleAndContent(uiBox, props, uiScene)
method uiSetTitle (line 683) | uiSetTitle(uiBox, props)
method uiSetContent (line 702) | uiSetContent(uiBox, props, uiScene)
method uiSetContentOptions (line 722) | uiSetContentOptions(uiScene, props, boxContent)
method startEngineScene (line 771) | async startEngineScene(player, room, previousScene = false)
method createEngineOnScene (line 791) | async createEngineOnScene(preloaderName, player, room, previousScene)
method createPreloaderAndScene (line 808) | async createPreloaderAndScene(preloaderName, uiScene, player, room, pr...
method showPlayerName (line 835) | showPlayerName(playerName)
method createEngineScene (line 855) | async createEngineScene(player, room, previousScene)
method addExistentPlayers (line 886) | addExistentPlayers(room, currentScene)
method playerBySessionIdFromState (line 915) | playerBySessionIdFromState(room, i)
method playersCountFromState (line 924) | playersCountFromState(room)
method playersKeysFromState (line 933) | playersKeysFromState(room)
method destroyPreviousScene (line 942) | async destroyPreviousScene(previousScene)
method updateSceneLabel (line 962) | updateSceneLabel(newLabel)
method getActiveScene (line 979) | getActiveScene()
method createSceneInstance (line 990) | createSceneInstance(sceneName, sceneData, gameManager)
method createPlayerEngineInstance (line 1002) | createPlayerEngineInstance(currentScene, player, gameManager, room)
method createPreloaderInstance (line 1011) | createPreloaderInstance(props)
method send (line 1021) | send(data, key)
FILE: lib/game/client/scene-dynamic.js
class SceneDynamic (line 21) | class SceneDynamic extends Scene
method constructor (line 29) | constructor(key, data, gameManager)
method setPropertiesFromConfig (line 56) | setPropertiesFromConfig()
method createMinimapInstance (line 77) | createMinimapInstance(config)
method init (line 85) | init()
method create (line 91) | async create()
method update (line 111) | update(time, delta)
method disableContextMenu (line 120) | disableContextMenu()
method setupKeyboardAndPointerEvents (line 132) | setupKeyboardAndPointerEvents()
method createSceneMap (line 145) | async createSceneMap()
method processMissingImagesFromTilesets (line 157) | processMissingImagesFromTilesets()
method addTilesetImages (line 189) | async addTilesetImages(loadMapImages)
method registerTilesetAnimation (line 209) | registerTilesetAnimation()
method hasTilesetAnimations (line 230) | hasTilesetAnimations(tileset)
method executeKeyDownBehavior (line 249) | executeKeyDownBehavior(event)
method executeKeyUpBehavior (line 273) | executeKeyUpBehavior(event)
method createControllerKeys (line 286) | createControllerKeys()
method addAndRemoveCapture (line 308) | addAndRemoveCapture(keys, inputElement)
method availableControllersKeyCodes (line 319) | availableControllersKeyCodes()
method executePointerDownAction (line 338) | executePointerDownAction(pointer, currentlyOver)
method movePlayerByPressedButtons (line 373) | movePlayerByPressedButtons()
method interpolatePositions (line 404) | interpolatePositions()
method processPlayersPositionInterpolation (line 416) | processPlayersPositionInterpolation()
method processObjectsPositionInterpolation (line 458) | processObjectsPositionInterpolation()
method interpolateBulletPosition (line 477) | interpolateBulletPosition(i, objectsPlugin)
method isBullet (line 508) | isBullet(objectKey)
method interpolateObjectAnimationPosition (line 518) | interpolateObjectAnimationPosition(i, objectsPlugin)
method isCurrentPosition (line 547) | isCurrentPosition(entity, entityState)
method changeScene (line 556) | async changeScene()
method registerLayers (line 572) | registerLayers()
method appendRowAndColumn (line 606) | appendRowAndColumn(pointer)
method createFloatingText (line 634) | createFloatingText(
method updatePointerObject (line 664) | updatePointerObject(pointer)
method getAnimationByKey (line 684) | getAnimationByKey(key)
method getObjectFromExtraData (line 699) | getObjectFromExtraData(objKey, extraData, currentPlayer)
method loopKeysAddListenerToElement (line 723) | loopKeysAddListenerToElement(keys, element, eventName, action)
FILE: lib/game/client/scene-preloader.js
class ScenePreloader (line 34) | class ScenePreloader extends Scene
method constructor (line 40) | constructor(props)
method preload (line 77) | preload()
method preloadMapJson (line 101) | preloadMapJson()
method preloadArrowPointer (line 110) | preloadArrowPointer()
method preloadUiScene (line 126) | preloadUiScene()
method preloadMapImages (line 169) | preloadMapImages()
method preloadValidAssets (line 180) | preloadValidAssets()
method create (line 202) | create()
method createUiScene (line 214) | createUiScene()
method createFullScreenButton (line 230) | createFullScreenButton()
method createSettingsUi (line 241) | createSettingsUi() {
method createMiniMap (line 250) | createMiniMap()
method createInstructionsBox (line 260) | createInstructionsBox()
method createControlsBox (line 270) | createControlsBox()
method createUi (line 296) | createUi(key, uiConfig)
method createContent (line 308) | createContent(key, x, y)
method createSceneLabelBox (line 313) | createSceneLabelBox()
method createTargetUi (line 322) | createTargetUi()
method createPlayerBox (line 335) | createPlayerBox()
method getUiConfig (line 359) | getUiConfig(uiName, newWidth, newHeight)
method getUiPosition (line 371) | getUiPosition(uiName, newWidth, newHeight)
method preloadPlayerDefaultSprite (line 395) | preloadPlayerDefaultSprite()
method createPlayerAnimations (line 407) | createPlayerAnimations(avatarKey)
method createArrowAnimation (line 449) | createArrowAnimation()
method createAnimationWith (line 469) | createAnimationWith(anim)
method registerControllers (line 489) | registerControllers(controllersBox)
method setupDefaultActionKey (line 502) | setupDefaultActionKey(controllersBox)
method createActionBox (line 518) | createActionBox(actionKey)
method setupDirButtonInBox (line 531) | setupDirButtonInBox(dir, box)
method setupActionButtonInBox (line 543) | setupActionButtonInBox(action, box)
method hold (line 568) | hold(button, action)
method startHold (line 592) | startHold(event, button, action)
method endHold (line 615) | endHold(event, button)
method showLoadingProgressBar (line 624) | showLoadingProgressBar()
method createText (line 663) | createText(width, height, text, styles)
method createGraphics (line 671) | createGraphics()
method onLoadComplete (line 676) | onLoadComplete()
method onFileProgress (line 690) | onFileProgress(file)
method onLoadProgress (line 702) | onLoadProgress(progress)
method getUiElement (line 722) | getUiElement(uiName, logError = true)
FILE: lib/game/client/settings-ui.js
class SettingsUi (line 16) | class SettingsUi
method createSettings (line 24) | createSettings(settingsConfig, uiScene)
FILE: lib/game/client/tileset-animation.js
class TileSetAnimation (line 11) | class TileSetAnimation
method constructor (line 18) | constructor(props)
method register (line 27) | register(layer, tileset)
method start (line 51) | start()
method repeat (line 67) | repeat(anim, index, next)
method destroy (line 84) | destroy()
method setTimeout (line 98) | setTimeout(callback, duration)
method clearTimeout (line 112) | clearTimeout(timer)
FILE: lib/game/client/ui-factory.js
class UiFactory (line 16) | class UiFactory
method constructor (line 22) | constructor(uiScene)
method create (line 36) | create(uiCodeName, depth, defaultOpen, defaultClose, openCallback, clo...
FILE: lib/game/client/user-interface.js
class UserInterface (line 17) | class UserInterface
method constructor (line 26) | constructor(gameManager, animProps, template = '/assets/html/dialog-bo...
method listenEvents (line 44) | listenEvents()
method preloadUiElement (line 60) | preloadUiElement(preloadScene)
method createUiElement (line 73) | createUiElement(uiScene, templateKey = '')
method createDialogBox (line 108) | createDialogBox(uiScene, templateKey)
method createBoxContent (line 120) | createBoxContent(uiScene, templateKey, dialogBox)
method activateOpenButton (line 135) | activateOpenButton(dialogBox, dialogContainer, uiScene)
method activateCloseButton (line 168) | activateCloseButton(dialogBox, dialogContainer, uiScene)
FILE: lib/game/properties-handler.js
class PropertiesHandler (line 13) | class PropertiesHandler
method constructor (line 16) | constructor()
method validate (line 25) | validate()
method assignProperties (line 40) | assignProperties(objectInstance)
FILE: lib/game/server/client-wrapper.js
class ClientWrapper (line 19) | class ClientWrapper
method constructor (line 25) | constructor(props)
method send (line 36) | send(data)
method broadcast (line 44) | broadcast(data)
FILE: lib/game/server/data-server-config.js
class DataServerConfig (line 14) | class DataServerConfig
method prepareDbConfig (line 31) | static prepareDbConfig(props)
method createConnectionString (line 69) | static createConnectionString(client, config)
FILE: lib/game/server/data-server-initializer.js
class DataServerInitializer (line 18) | class DataServerInitializer
method initializeEntitiesAndDriver (line 29) | static initializeEntitiesAndDriver(props)
method rebindObjectionJsModelsToNewKnex (line 63) | static rebindObjectionJsModelsToNewKnex(dataServer, dataServerConfig)
method loadProjectPrismaClient (line 114) | static loadProjectPrismaClient(installerDataServer, projectRoot)
FILE: lib/game/server/entities-loader.js
class EntitiesLoader (line 16) | class EntitiesLoader
method loadEntities (line 29) | static loadEntities(props)
method findGeneratedModelsPath (line 65) | static findGeneratedModelsPath(projectRoot, storageDriver)
method loadFromGeneratedEntities (line 92) | static loadFromGeneratedEntities(
method loadImplementationConfigOverride (line 149) | static loadImplementationConfigOverride(props)
method applyEntityOverrides (line 165) | static applyEntityOverrides(config, overrides, overrideParams, props)
method loadPluginData (line 186) | static loadPluginData(reldensModuleLibPath, storageDriver)
method discoverPluginFolders (line 208) | static discoverPluginFolders(reldensModuleLibPath)
method loadPluginEntityOverrides (line 226) | static loadPluginEntityOverrides(pluginServerPath, entityOverrides)
method loadPluginTranslations (line 243) | static loadPluginTranslations(pluginServerPath, translations)
method loadPluginModelOverrides (line 266) | static loadPluginModelOverrides(pluginServerPath, storageDriver, model...
method loadImplementationData (line 288) | static loadImplementationData(props)
FILE: lib/game/server/entity-properties.js
class EntityProperties (line 14) | class EntityProperties
method propertiesDefinition (line 20) | static propertiesDefinition()
method propertiesConfig (line 30) | static propertiesConfig(extraProps)
FILE: lib/game/server/forgot-password.js
class ForgotPassword (line 15) | class ForgotPassword
method defineRequestOnServerManagerApp (line 22) | static async defineRequestOnServerManagerApp(serverManager)
method resetResultContent (line 52) | static async resetResultContent(user, rId, serverManager, rEmail)
FILE: lib/game/server/game-server.js
class GameServer (line 28) | class GameServer extends Server
method constructor (line 34) | constructor(options)
method attachMonitor (line 45) | attachMonitor(app, config)
method attachUnsecureMonitor (line 54) | attachUnsecureMonitor(app)
method attacheSecuredMonitor (line 64) | attacheSecuredMonitor(config, app)
method hasAuthentication (line 79) | hasAuthentication(config)
method runOnShutDown (line 84) | runOnShutDown()
FILE: lib/game/server/homepage-loader.js
class HomepageLoader (line 16) | class HomepageLoader
method loadContents (line 24) | static async loadContents(requestLanguage, distPath)
method createConfigFile (line 51) | static createConfigFile(projectThemePath, initialConfiguration)
FILE: lib/game/server/installer.js
class Installer (line 36) | class Installer
method constructor (line 42) | constructor(props)
method updateInstallStatus (line 83) | updateInstallStatus(message)
method clearInstallStatus (line 95) | clearInstallStatus()
method isInstalled (line 105) | isInstalled()
method prepareSetup (line 118) | async prepareSetup(app, appServerFactory)
method executeInstallProcess (line 162) | async executeInstallProcess(req, res)
method setDatabaseUrl (line 273) | setDatabaseUrl(templateVariables)
method normalizeFilePaths (line 290) | normalizeFilePaths(templateVariables)
method cleanAssets (line 305) | cleanAssets()
method executeForEveryRequest (line 356) | async executeForEveryRequest(next, req, res, applicationFramework)
method fetchDefaults (line 376) | fetchDefaults()
method encoding (line 409) | encoding()
method setCheckboxesMissingValues (line 417) | setCheckboxesMissingValues(templateVariables)
method setVariable (line 436) | setVariable(templateVariables, checkboxId)
method setSelectedOptions (line 448) | setSelectedOptions(templateVariables)
FILE: lib/game/server/installer/entities-installation.js
class EntitiesInstallation (line 30) | class EntitiesInstallation
method constructor (line 36) | constructor(props)
method generateEntities (line 53) | async generateEntities(server, isOverride, isInstallationMode, isDryPr...
method extractDbConfigFromServer (line 100) | extractDbConfigFromServer(server)
FILE: lib/game/server/installer/generic-driver-installation.js
class GenericDriverInstallation (line 29) | class GenericDriverInstallation
method isMySqlClient (line 36) | isMySqlClient(client)
method executeRawQuery (line 50) | async executeRawQuery(dbDriver, migrationsPath, fileName)
method executeInstallation (line 62) | async executeInstallation(selectedDriver, dbConfig, templateVariables,...
FILE: lib/game/server/installer/packages-installation.js
class PackagesInstallation (line 21) | class PackagesInstallation
method constructor (line 27) | constructor(props)
method unlinkAllPackages (line 56) | unlinkAllPackages()
method checkAndInstallPackages (line 79) | checkAndInstallPackages(storageDriverKey)
method findVersionInLockFile (line 104) | findVersionInLockFile(lockData, packageName)
method processPackages (line 131) | processPackages(packages, command)
method isPackageInstalled (line 176) | isPackageInstalled(packageName)
FILE: lib/game/server/installer/prisma-installation.js
class PrismaInstallation (line 38) | class PrismaInstallation
method constructor (line 44) | constructor(props)
method requireClient (line 60) | requireClient(clientPath)
method executeInstallation (line 72) | async executeInstallation(selectedDriver, dbConfig, templateVariables,...
method generatePrismaSchema (line 87) | async generatePrismaSchema(connectionData, useDataProxy)
method createPrismaClient (line 110) | async createPrismaClient(projectRoot)
method runSubprocessInstallation (line 137) | async runSubprocessInstallation(dbConfig, templateVariables, migration...
method waitMilliseconds (line 205) | async waitMilliseconds(ms)
FILE: lib/game/server/installer/prisma-subprocess-worker.js
class PrismaSubprocessWorker (line 27) | class PrismaSubprocessWorker
method constructor (line 30) | constructor()
method migrationFiles (line 38) | static migrationFiles()
method isMySqlClient (line 51) | isMySqlClient(client)
method setupProcessHandlers (line 59) | setupProcessHandlers()
method processIncomingMessage (line 86) | async processIncomingMessage(message)
method sendSuccessResponse (line 141) | sendSuccessResponse(message)
method sendErrorResponse (line 150) | sendErrorResponse(errorMessage)
method setDatabaseUrlEnvVar (line 158) | setDatabaseUrlEnvVar(dbConfig)
FILE: lib/game/server/installer/project-files-creation.js
class ProjectFilesCreation (line 25) | class ProjectFilesCreation
method constructor (line 31) | constructor(props)
method createProjectFiles (line 47) | async createProjectFiles(templateVariables, storageDriverKey, dataServer)
FILE: lib/game/server/login-manager.js
class LoginManager (line 35) | class LoginManager
method constructor (line 41) | constructor(props)
method listenEvents (line 89) | listenEvents()
method disconnectUserByLoginData (line 131) | async disconnectUserByLoginData(req)
method mapRoomsServers (line 160) | mapRoomsServers()
method broadcastDisconnectionMessage (line 179) | async broadcastDisconnectionMessage(userModel, options)
method disconnectFromServer (line 211) | async disconnectFromServer(serverUrl, options)
method disconnectUserFromEveryRoom (line 245) | async disconnectUserFromEveryRoom(userModel, avoidGameRoom = false)
method processUserRequest (line 280) | async processUserRequest(userData = false)
method overrideWithGuestData (line 326) | overrideWithGuestData(userData)
method hasValidUserName (line 343) | hasValidUserName(userData)
method mapPlayerStateRelation (line 351) | mapPlayerStateRelation(user)
method login (line 368) | async login(user, userData)
method isValidGuestLogin (line 405) | isValidGuestLogin(userData, user)
method setSceneOnPlayers (line 423) | async setSceneOnPlayers(user, userData)
method roleAuthenticationCallback (line 449) | async roleAuthenticationCallback(email, password, roleId = 0)
method applySelectedLocation (line 470) | async applySelectedLocation(player, selectedScene)
method getRoomNameById (line 483) | async getRoomNameById(roomId)
method register (line 496) | async register(userData)
method createNewPlayer (line 530) | async createNewPlayer(loginData)
method validateInitialState (line 581) | async validateInitialState(initialState)
method prepareInitialState (line 597) | async prepareInitialState(roomName)
method getStateObjectFromRoom (line 623) | getStateObjectFromRoom(selectedRoom)
method updateLastLogin (line 639) | async updateLastLogin(userModel)
method processForgotPassword (line 653) | async processForgotPassword(userData)
method sendForgotPasswordEmail (line 688) | async sendForgotPasswordEmail(userData, oldPassword)
FILE: lib/game/server/mailer.js
class Mailer (line 28) | class Mailer
method constructor (line 34) | constructor(props)
method fetchServiceInstance (line 66) | fetchServiceInstance(serviceKey)
method setupTransporter (line 81) | async setupTransporter()
method isEnabled (line 93) | isEnabled()
method sendEmail (line 107) | async sendEmail(props)
FILE: lib/game/server/mailer/nodemailer-factory.js
class NodemailerFactory (line 28) | class NodemailerFactory
method setup (line 35) | setup(mailer)
method sendMail (line 75) | async sendMail(props)
FILE: lib/game/server/mailer/sendgrid-factory.js
class SendGridFactory (line 24) | class SendGridFactory
method setup (line 31) | async setup(mailer)
method sendMail (line 54) | async sendMail(props)
FILE: lib/game/server/manager.js
class ServerManager (line 35) | class ServerManager
method constructor (line 82) | constructor(config, eventsManager, dataServerDriver)
method setupCustomServerPlugin (line 113) | setupCustomServerPlugin(config)
method initializeConfiguration (line 127) | initializeConfiguration(config)
method fetchConfigServerFromEnvironmentVariables (line 143) | fetchConfigServerFromEnvironmentVariables()
method initializeStorage (line 186) | async initializeStorage(config, dataServerDriver)
method start (line 215) | async start()
method startGameServerInstance (line 255) | async startGameServerInstance()
method validateServer (line 287) | validateServer()
method showInfoLogs (line 300) | showInfoLogs()
method createServers (line 320) | async createServers()
method createAppServer (line 333) | async createAppServer()
method enableServeStaticsAndHomePage (line 349) | async enableServeStaticsAndHomePage()
method createGameServer (line 364) | async createGameServer()
method initializeManagers (line 391) | async initializeManagers()
method defineServerRooms (line 411) | async defineServerRooms()
method initializeLoginManager (line 422) | initializeLoginManager()
method initializeRoomsManager (line 439) | async initializeRoomsManager()
method initializeUsersManager (line 450) | initializeUsersManager()
method initializeFeaturesManager (line 462) | async initializeFeaturesManager()
method initializeMailer (line 481) | async initializeMailer(mailer)
method initializeConfigManager (line 500) | async initializeConfigManager()
method configGuestEmailDomain (line 509) | configGuestEmailDomain()
method configRoomsServerUrl (line 525) | async configRoomsServerUrl()
method serverBroadcast (line 548) | async serverBroadcast(props)
FILE: lib/game/server/maps-loader.js
class MapsLoader (line 14) | class MapsLoader
method reloadMaps (line 21) | static reloadMaps(themeFolder, configManager)
FILE: lib/game/server/memory/active-player.js
class ActivePlayer (line 31) | class ActivePlayer
method constructor (line 37) | constructor(props)
FILE: lib/game/server/memory/active-players.js
class ActivePlayers (line 30) | class ActivePlayers
method constructor (line 33) | constructor()
method add (line 51) | add(userModel, client, room)
method fetchByRoomAndSessionId (line 96) | fetchByRoomAndSessionId(sessionId, roomId, withPlayer = false)
method fetchByRoomAndUserName (line 125) | fetchByRoomAndUserName(userName, roomId, withPlayer = false)
method fetchByRoomAndPlayerId (line 155) | fetchByRoomAndPlayerId(playerId, roomId, withPlayer = false)
method fetchByRoomAndPlayerName (line 178) | fetchByRoomAndPlayerName(playerName, roomId, withPlayer = false)
method removeAllByUserId (line 200) | removeAllByUserId(userId)
method removeByRoomAndSessionId (line 219) | removeByRoomAndSessionId(sessionId, roomId)
FILE: lib/game/server/template-engine.js
class TemplateEngine (line 15) | class TemplateEngine
method render (line 23) | static async render(content, params)
method renderFile (line 33) | static async renderFile(filePath, params)
FILE: lib/game/server/templates-to-path-mapper.js
class TemplatesToPathMapper (line 15) | class TemplatesToPathMapper
method map (line 23) | map(templateList, path)
FILE: lib/game/server/theme-manager.js
class ThemeManager (line 27) | class ThemeManager
method constructor (line 90) | constructor(props)
method setupPaths (line 111) | setupPaths(props)
method paths (line 176) | paths()
method assetPath (line 200) | assetPath(...args)
method permissionsCheck (line 208) | permissionsCheck()
method resetDist (line 213) | resetDist()
method removeDist (line 225) | removeDist()
method installDefaultTheme (line 230) | installDefaultTheme()
method copyAssetsToDist (line 254) | copyAssetsToDist()
method copyKnexFile (line 264) | copyKnexFile()
method copyEnvFile (line 274) | copyEnvFile()
method copyGitignoreFile (line 283) | copyGitignoreFile()
method copyIndex (line 296) | async copyIndex(override = false)
method copyDefaultAssets (line 323) | copyDefaultAssets()
method copyDefaultTheme (line 336) | copyDefaultTheme()
method copyPackage (line 349) | copyPackage()
method copyAdmin (line 362) | copyAdmin()
method buildCss (line 375) | async buildCss()
method copyAdminFiles (line 398) | copyAdminFiles()
method copyAdminAssetsToDist (line 421) | async copyAdminAssetsToDist()
method buildSkeleton (line 436) | async buildSkeleton()
method buildClient (line 446) | async buildClient()
method clearBundlerCache (line 477) | async clearBundlerCache(folderPath)
method buildInstaller (line 485) | async buildInstaller()
method createBrowserBundler (line 505) | createBrowserBundler(entryPath)
method generateDefaultBrowserBundleOptions (line 514) | generateDefaultBrowserBundleOptions(entryPath)
method createCssBundler (line 549) | createCssBundler(entryPath)
method copyNew (line 569) | copyNew()
method fullRebuild (line 580) | async fullRebuild()
method installSkeleton (line 590) | async installSkeleton()
method createApp (line 601) | async createApp()
method copyServerFiles (line 613) | async copyServerFiles()
method distPathExists (line 624) | distPathExists()
method themePathExists (line 634) | themePathExists()
method validateOrCreateTheme (line 641) | validateOrCreateTheme()
method loadAndRenderTemplate (line 662) | async loadAndRenderTemplate(filePath, params)
method createClientBundle (line 675) | async createClientBundle()
method updatePackageJson (line 697) | async updatePackageJson()
FILE: lib/game/type-determiner.js
class TypeDeterminer (line 19) | class TypeDeterminer
method isPlayer (line 26) | isPlayer(skillOwner)
method isObject (line 36) | isObject(skillOwner)
FILE: lib/import/server/attributes-per-level-importer.js
class AttributesPerLevelImporter (line 18) | class AttributesPerLevelImporter
method constructor (line 24) | constructor(serverManager)
method import (line 46) | async import(data)
method validRepositories (line 81) | validRepositories(repositoriesKey)
method createStats (line 96) | async createStats(statsData)
method createPlayerStatsPerLevelAndClassPath (line 110) | async createPlayerStatsPerLevelAndClassPath(playerStatsByLevelAndClass...
method createPlayerStatsPerClassPath (line 123) | async createPlayerStatsPerClassPath(statsByClassPath, level)
method createPlayerStats (line 142) | async createPlayerStats(statsData, levelModel)
method createStatsModifiers (line 160) | async createStatsModifiers(levelModel, statKey, statsData)
method fetchStatIdByKey (line 181) | async fetchStatIdByKey(statKey)
method fetchLevelByClassPathKey (line 191) | async fetchLevelByClassPathKey(level, classPathKey)
FILE: lib/import/server/class-paths-importer.js
class ClassPathsImporter (line 18) | class ClassPathsImporter
method constructor (line 24) | constructor(serverManager)
method import (line 44) | async import(data)
method createSubClasses (line 93) | async createSubClasses(classPathId, data, label)
method preAppendRaceToAbilities (line 109) | preAppendRaceToAbilities(data)
FILE: lib/import/server/maps-importer.js
class MapsImporter (line 26) | class MapsImporter
method constructor (line 32) | constructor(props)
method setupRepositories (line 65) | setupRepositories()
method import (line 83) | async import(data)
method setImportFilesPath (line 117) | setImportFilesPath(data)
method validRepositories (line 133) | validRepositories(repositoriesKey)
method loadValidMaps (line 147) | async loadValidMaps()
method loadMapByTitle (line 168) | loadMapByTitle(mapTitle, useTitleAsFileName = false)
method createRooms (line 213) | async createRooms()
method copyExtrudedFiles (line 227) | async copyExtrudedFiles(fileNames)
method createRoomByMapTitle (line 246) | async createRoomByMapTitle(mapTitle, useTitleAsFileName = false)
method fetchRoomTitle (line 348) | fetchRoomTitle(mapName, mapTitle)
method copyFiles (line 365) | async copyFiles(fileNames)
method createRoomsChangePoints (line 390) | async createRoomsChangePoints(mapName, createdRoom)
method createRoomsReturnPoints (line 447) | async createRoomsReturnPoints(createdRoom)
method fetchReturnPointsFromLayer (line 501) | fetchReturnPointsFromLayer(layer)
method saveReturnPoint (line 572) | async saveReturnPoint(isDefault, createdRoom, roomModel, returnPointDa...
method provideRoomByName (line 616) | async provideRoomByName(roomName)
FILE: lib/import/server/objects-importer.js
class ObjectsImporter (line 19) | class ObjectsImporter
method constructor (line 27) | constructor(props)
method setupRepositories (line 58) | setupRepositories()
method import (line 88) | async import(data)
method enrichObjectData (line 134) | enrichObjectData(objectData)
method fetchAttributes (line 151) | fetchAttributes(enrichedObjectData, level)
method fetchExperience (line 185) | fetchExperience(enrichedObjectData, level)
method validRepositories (line 209) | validRepositories(repositoriesKey)
method loadObjectTypes (line 223) | async loadObjectTypes()
method loadStats (line 237) | async loadStats()
method loadDataFromJsonFile (line 253) | loadDataFromJsonFile(filePath)
method createObjectPerRoom (line 265) | async createObjectPerRoom(objectData)
method fetchRooms (line 285) | async fetchRooms(objectData)
method createObjectForRoom (line 321) | async createObjectForRoom(objectData, roomId)
method fetchClassTypeId (line 350) | fetchClassTypeId(classType)
method createObjectAssets (line 366) | async createObjectAssets(createdObjectId, objectData)
method createObjectAnimations (line 391) | async createObjectAnimations(createdObjectId, objectData)
method convertToJsonString (line 417) | convertToJsonString(data)
method createObjectStats (line 436) | async createObjectStats(createdObjectId, objectData)
method createObjectRespawn (line 467) | async createObjectRespawn(createdObjectId, objectData)
method createObjectExperienceReward (line 490) | async createObjectExperienceReward(createdObjectId, objectData)
method fetchRoomsBy (line 513) | async fetchRoomsBy(field, objectRoomsDataSet)
FILE: lib/import/server/players-experience-per-level-importer.js
class PlayersExperiencePerLevelImporter (line 14) | class PlayersExperiencePerLevelImporter
method constructor (line 20) | constructor(serverManager)
method import (line 33) | async import(data, levelSetId)
FILE: lib/import/server/skills-importer.js
class SkillsImporter (line 18) | class SkillsImporter
method constructor (line 25) | constructor(props)
method setupRepositories (line 41) | setupRepositories()
method import (line 83) | async import(data)
method upsertSkill (line 123) | async upsertSkill(key, existentSkill)
method loadTargetOptions (line 147) | async loadTargetOptions()
method loadOperationTypes (line 159) | async loadOperationTypes()
method loadSkillTypes (line 170) | async loadSkillTypes()
method loadClassPaths (line 181) | async loadClassPaths()
method updateSkill (line 196) | async updateSkill(existentSkill, skillsData)
method createSkill (line 207) | async createSkill(key, skillsData)
method updateSkillAssociations (line 219) | async updateSkillAssociations(skillsData, existentSkill)
method updateSkillPhysicalData (line 236) | async updateSkillPhysicalData(skillsData, existentSkill)
method updateSkillAttack (line 254) | async updateSkillAttack(skillsData, existentSkill)
method updateTargetEffects (line 272) | async updateTargetEffects(skillsData, existentSkill)
method updateOwnerEffects (line 298) | async updateOwnerEffects(skillsData, existentSkill)
method updateAnimations (line 325) | async updateAnimations(skillsData, existentSkill)
method updateOwnerConditions (line 356) | async updateOwnerConditions(skillsData, existentSkill)
method updateClassPathLevelSkill (line 378) | async updateClassPathLevelSkill(skillsData, existentSkill)
method updateObjectSkill (line 397) | async updateObjectSkill(skillsData, existentSkill)
method removeAllSKills (line 426) | async removeAllSKills()
method deleteSkill (line 448) | async deleteSkill(skillId)
method loadExistentSkill (line 467) | async loadExistentSkill(key)
FILE: lib/import/server/tile-extruder.js
function copyPixels (line 22) | function copyPixels(srcImage, srcX, srcY, srcW, srcH, destImage, destX, ...
function copyPixelToRect (line 45) | function copyPixelToRect(srcImage, srcX, srcY, destImage, destX, destY, ...
function ExtrudeTileset (line 67) | async function ExtrudeTileset(tw, th, inputPath, {margin = 0, spacing = ...
FILE: lib/inventory/client/exchange/trade-target-action.js
class TradeTargetAction (line 17) | class TradeTargetAction
method showTargetExchangeAction (line 27) | showTargetExchangeAction(gameManager, target, previousTarget, targetName)
FILE: lib/inventory/client/inventory-receiver.js
class InventoryReceiver (line 18) | class InventoryReceiver extends Receiver
method constructor (line 24) | constructor(props)
method onExecuting (line 42) | onExecuting(message)
method createItemSprites (line 81) | createItemSprites(animKey, item, message, currentScene)
method playSpriteAnimation (line 132) | playSpriteAnimation(animKey, item)
method destroyAnimation (line 153) | destroyAnimation(item, animKey, playerSprite)
method extractTargetId (line 170) | extractTargetId(item, message, currentScene)
FILE: lib/inventory/client/inventory-ui.js
class InventoryUi (line 13) | class InventoryUi extends UiFactory
method createUi (line 16) | createUi()
method inventoryVisibility (line 34) | inventoryVisibility(constantCodeName)
FILE: lib/inventory/client/plugin.js
class InventoryPlugin (line 28) | class InventoryPlugin extends PluginInterface
method setup (line 34) | async setup(props)
method setTranslations (line 57) | setTranslations()
method setTradeUi (line 69) | setTradeUi()
method setListener (line 83) | setListener()
method listenEvents (line 95) | listenEvents()
method onPreloadUiScene (line 118) | onPreloadUiScene(preloadScene)
method activateGroupAndEquipmentUi (line 133) | activateGroupAndEquipmentUi(preloadScene, manager)
method activateInventoryUi (line 173) | activateInventoryUi(preloadScene, manager, equipmentPanel)
method onPlayerAdd (line 205) | onPlayerAdd(key, roomEvents, player)
method createInventoryInstance (line 223) | createInventoryInstance(player, roomEvents)
method listenInventoryEvents (line 246) | listenInventoryEvents(uiScene, inventoryPanel, equipmentPanel)
method resetEquippedItemsDisplay (line 336) | resetEquippedItemsDisplay(gameManager, uiScene, equipmentPanel, invent...
method displayItem (line 359) | displayItem(item, uiScene, equipmentPanel, inventoryPanel, itemIdx)
method displayItemInGroups (line 383) | displayItemInGroups(item, uiScene, output)
method updateEquipmentStatus (line 400) | updateEquipmentStatus(item, gameManager)
method createItemBox (line 415) | createItemBox(item, templateKey, gameManager, uiScene)
method isEquipment (line 433) | isEquipment(item)
method isEquipped (line 442) | isEquipped(item)
method isUsable (line 451) | isUsable(item)
method sortGroups (line 460) | sortGroups(groups)
method createGroupBox (line 473) | createGroupBox(group, gameManager, uiScene)
method setupButtonsActions (line 491) | setupButtonsActions(inventoryPanel, idx, item, preloadScene)
method clickedBox (line 558) | clickedBox(itemId, action, preloadScene)
method getUsableContent (line 569) | getUsableContent(item, gameManager, uiScene)
method getEquipContent (line 583) | getEquipContent(item, gameManager, uiScene)
method getGroupById (line 597) | getGroupById(groupId, groupsList)
FILE: lib/inventory/client/templates-handler.js
class TemplatesHandler (line 9) | class TemplatesHandler
method preloadTemplates (line 15) | static preloadTemplates(preloadScene)
FILE: lib/inventory/client/trade-items-helper.js
class TradeItemsHelper (line 11) | class TradeItemsHelper
method createItemInstance (line 20) | static createItemInstance(items, i, itemsManager)
FILE: lib/inventory/client/trade-message-handler.js
class TradeMessageHandler (line 23) | class TradeMessageHandler
method constructor (line 29) | constructor(props)
method validate (line 46) | validate()
method updateContents (line 68) | updateContents()
method showTradeRequest (line 82) | showTradeRequest()
method showTradeBox (line 110) | showTradeBox()
method createTradeUi (line 149) | createTradeUi(tradeUiKey)
method updateItemsList (line 169) | updateItemsList(items, container, exchangeData)
method activateConfirmButtonAction (line 189) | activateConfirmButtonAction(exchangeData)
method updateMyExchangeData (line 235) | updateMyExchangeData(exchangeDataItems, items, exchangeKey)
method updateTraderExchangeData (line 257) | updateTraderExchangeData(exchangeDataItems, traderItemsData, exchangeKey)
method createConfirmItemsBox (line 277) | createConfirmItemsBox(exchangeItems, items)
method createReceivingItemsBox (line 315) | createReceivingItemsBox(exchangeItems, traderItemsData)
method assignRemoveActions (line 352) | assignRemoveActions(exchangeItems, items)
method createTradeContainer (line 394) | createTradeContainer(tradeItems)
method playerConfirmedLabel (line 434) | playerConfirmedLabel()
method createTradeItemBox (line 450) | createTradeItemBox(item, exchangeDataItem)
method createTradeActionContent (line 485) | createTradeActionContent(item, tradeAction)
method createTradeActionRemove (line 504) | createTradeActionRemove(item)
method activateItemsBoxActions (line 522) | activateItemsBoxActions(items)
FILE: lib/inventory/client/trade-message-listener.js
class TradeMessageListener (line 13) | class TradeMessageListener
method executeClientMessageActions (line 20) | async executeClientMessageActions(props)
FILE: lib/inventory/server/entities/items-group-entity-override.js
class ItemsGroupEntityOverride (line 17) | class ItemsGroupEntityOverride extends ItemsGroupEntity
method propertiesConfig (line 25) | static propertiesConfig(extraProps, projectConfig)
FILE: lib/inventory/server/entities/items-inventory-entity-override.js
class ItemsInventoryEntityOverride (line 12) | class ItemsInventoryEntityOverride extends ItemsInventoryEntity
method propertiesConfig (line 19) | static propertiesConfig(extraProps)
FILE: lib/inventory/server/entities/items-item-entity-override.js
class ItemsItemEntityOverride (line 13) | class ItemsItemEntityOverride extends ItemsItemEntity
method propertiesConfig (line 20) | static propertiesConfig(extraProps)
FILE: lib/inventory/server/exchange/player-processor.js
class PlayerProcessor (line 13) | class PlayerProcessor extends Processor
method confirm (line 20) | static async confirm(props)
method disconfirm (line 37) | static async disconfirm(props)
FILE: lib/inventory/server/exchange/processor.js
class Processor (line 13) | class Processor
method init (line 20) | static async init(props)
method add (line 47) | static async add(props)
Condensed preview — 991 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,913K chars).
[
{
"path": ".claude/client-camera-follow-system.md",
"chars": 7342,
"preview": "# Client Camera Follow System Architecture\n\nThis document describes how the camera follow system works in the Reldens cl"
},
{
"path": ".claude/commands-reference.md",
"chars": 5769,
"preview": "# Commands Reference\n\nComplete reference for all Reldens CLI commands.\n\n## CLI Binaries\n\nThe project provides three main"
},
{
"path": ".claude/entities-reference.md",
"chars": 2180,
"preview": "# Entities Reference\n\nComplete list of all 60+ entity types in the Reldens platform.\n\nEntities are located in `generated"
},
{
"path": ".claude/environment-variables.md",
"chars": 4805,
"preview": "# Environment Variables Reference\n\nComplete reference for all RELDENS_* environment variables.\n\nSee `lib/game/server/ins"
},
{
"path": ".claude/feature-modules.md",
"chars": 3886,
"preview": "# Feature Modules Reference\n\nComplete reference for all 23 feature modules under `lib/`.\n\n## Core/Game Management\n\n### G"
},
{
"path": ".claude/guest-system-technical-guide.md",
"chars": 11602,
"preview": "# Guest System Technical Guide\n\n## Overview\n\nThe guest system allows anonymous players to join the game without registra"
},
{
"path": ".claude/installer-guide.md",
"chars": 11128,
"preview": "# Installer Guide\n\nComplete guide for the Reldens web-based installation wizard.\n\n## Overview\n\nThe Reldens installer (`l"
},
{
"path": ".claude/items-system-implementation.md",
"chars": 16599,
"preview": "# Items System Implementation - Complete Documentation\n\n## Overview\n\nThe Reldens Items System manages player inventory, "
},
{
"path": ".claude/player-state-flow.md",
"chars": 10925,
"preview": "# Player State Flow - Complete Technical Guide\n\n## Overview\n\nThis document explains the complete player state management"
},
{
"path": ".claude/room-data-optimization.md",
"chars": 19307,
"preview": "# Room Data Optimization - Scene Data Filter\n\n**Purpose**: Optimize Colyseus schema buffer usage by detecting and extrac"
},
{
"path": ".claude/room-images-tileset-override-flow.md",
"chars": 10481,
"preview": "# Room Images and Tileset Override System\n\n## Overview\n\nThis document explains how the room scene images upload system w"
},
{
"path": ".claude/stat-bars-configuration.md",
"chars": 21914,
"preview": "# Stat Bars Configuration\n\n## Overview\n\nThe player stats bars system is a generic client-side feature that displays visu"
},
{
"path": ".claude/storage-architecture.md",
"chars": 8013,
"preview": "# Storage & Entity Management Architecture\n\nComplete reference for the storage system and entity management.\n\n## Entity "
},
{
"path": ".claude/trade-system-implementation.md",
"chars": 9125,
"preview": "# Trade System Flow - Player-to-Player Trading\n\n## Server to Client Data Flow\n\n**Server sends to each player (via TRADE_"
},
{
"path": ".claude/ui-visibility-configuration.md",
"chars": 9171,
"preview": "# UI Visibility Configuration\n\n## Overview\n\nThis document describes the configuration system for controlling visibility "
},
{
"path": ".github/FUNDING.yml",
"chars": 651,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".github/workflows/codeql.yml",
"chars": 842,
"preview": "name: \"CodeQL\"\n\non:\n push:\n branches: [ \"master\" ]\n pull_request:\n branches: [ \"master\" ]\n schedule:\n - cron"
},
{
"path": ".gitignore",
"chars": 274,
"preview": "/.cache\n/.env\n/.idea\n/knexfile.js\n/node_modules\n/npm-debug*\n/test\n/ts-node*\n/v8-compile-cache*\n/dev\nwinpty.exe.stackdump"
},
{
"path": "CLAUDE.md",
"chars": 10580,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "LICENSE",
"chars": 1081,
"preview": "MIT License\n\nCopyright (c) 2018 Damian Alberto Pastorini\n\nPermission is hereby granted, free of charge, to any person ob"
},
{
"path": "README.md",
"chars": 7842,
"preview": "<div style=\"width: 100%; background-color: #000000; text-align: center;\">\n <a href=\"https://github.com/damian-pastori"
},
{
"path": "bin/commander.js",
"chars": 9366,
"preview": "#! /usr/bin/env node\n\n/**\n *\n * Reldens - Commands\n *\n */\n\nconst dotenv = require('dotenv');\nconst { spawn } = require('"
},
{
"path": "bin/generate.js",
"chars": 5652,
"preview": "#! /usr/bin/env node\n\nconst {\n PlayersExperiencePerLevel,\n MonstersExperiencePerLevel,\n AttributesPerLevel\n} = "
},
{
"path": "bin/import.js",
"chars": 4446,
"preview": "#! /usr/bin/env node\n\nconst { ServerManager } = require('../server');\nconst { ObjectsImporter } = require('../lib/import"
},
{
"path": "bin/install-test.js",
"chars": 350,
"preview": "#! /usr/bin/env node\n\n/**\n *\n * Reldens - Install Test\n *\n */\n\nconst commander = require('./commander');\n\ncommander.proj"
},
{
"path": "bin/reldens-commands.js",
"chars": 313,
"preview": "#! /usr/bin/env node\n\n/**\n *\n * Reldens - Commands\n *\n */\n\nconst commander = require('./commander');\n\nif(commander.prepa"
},
{
"path": "client.js",
"chars": 245,
"preview": "/**\n *\n * Reldens - GameManager\n *\n */\n\n// transpile and polyfill:\nrequire('core-js/stable');\nrequire('regenerator-runti"
},
{
"path": "generated-entities/entities/ads-banner-entity.js",
"chars": 1308,
"preview": "/**\n *\n * Reldens - AdsBannerEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AdsBannerEn"
},
{
"path": "generated-entities/entities/ads-entity.js",
"chars": 2553,
"preview": "/**\n *\n * Reldens - AdsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('"
},
{
"path": "generated-entities/entities/ads-event-video-entity.js",
"chars": 1430,
"preview": "/**\n *\n * Reldens - AdsEventVideoEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AdsEven"
},
{
"path": "generated-entities/entities/ads-played-entity.js",
"chars": 1484,
"preview": "/**\n *\n * Reldens - AdsPlayedEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AdsPlayedEn"
},
{
"path": "generated-entities/entities/ads-providers-entity.js",
"chars": 1212,
"preview": "/**\n *\n * Reldens - AdsProvidersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AdsProvi"
},
{
"path": "generated-entities/entities/ads-types-entity.js",
"chars": 1091,
"preview": "/**\n *\n * Reldens - AdsTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AdsTypesEnti"
},
{
"path": "generated-entities/entities/audio-categories-entity.js",
"chars": 1638,
"preview": "/**\n *\n * Reldens - AudioCategoriesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc }"
},
{
"path": "generated-entities/entities/audio-entity.js",
"chars": 1953,
"preview": "/**\n *\n * Reldens - AudioEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require"
},
{
"path": "generated-entities/entities/audio-markers-entity.js",
"chars": 1656,
"preview": "/**\n *\n * Reldens - AudioMarkersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AudioMar"
},
{
"path": "generated-entities/entities/audio-player-config-entity.js",
"chars": 1387,
"preview": "/**\n *\n * Reldens - AudioPlayerConfigEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Aud"
},
{
"path": "generated-entities/entities/chat-entity.js",
"chars": 1776,
"preview": "/**\n *\n * Reldens - ChatEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ChatEntity exten"
},
{
"path": "generated-entities/entities/chat-message-types-entity.js",
"chars": 1391,
"preview": "/**\n *\n * Reldens - ChatMessageTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Chat"
},
{
"path": "generated-entities/entities/clan-entity.js",
"chars": 1784,
"preview": "/**\n *\n * Reldens - ClanEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require("
},
{
"path": "generated-entities/entities/clan-levels-entity.js",
"chars": 1346,
"preview": "/**\n *\n * Reldens - ClanLevelsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ClanLevels"
},
{
"path": "generated-entities/entities/clan-levels-modifiers-entity.js",
"chars": 2013,
"preview": "/**\n *\n * Reldens - ClanLevelsModifiersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass C"
},
{
"path": "generated-entities/entities/clan-members-entity.js",
"chars": 1276,
"preview": "/**\n *\n * Reldens - ClanMembersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ClanMembe"
},
{
"path": "generated-entities/entities/config-entity.js",
"chars": 1498,
"preview": "/**\n *\n * Reldens - ConfigEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ConfigEntity e"
},
{
"path": "generated-entities/entities/config-types-entity.js",
"chars": 1105,
"preview": "/**\n *\n * Reldens - ConfigTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ConfigTyp"
},
{
"path": "generated-entities/entities/drops-animations-entity.js",
"chars": 1594,
"preview": "/**\n *\n * Reldens - DropsAnimationsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Drops"
},
{
"path": "generated-entities/entities/features-entity.js",
"chars": 1304,
"preview": "/**\n *\n * Reldens - FeaturesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass FeaturesEnti"
},
{
"path": "generated-entities/entities/items-group-entity.js",
"chars": 1822,
"preview": "/**\n *\n * Reldens - ItemsGroupEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = re"
},
{
"path": "generated-entities/entities/items-inventory-entity.js",
"chars": 1603,
"preview": "/**\n *\n * Reldens - ItemsInventoryEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ItemsI"
},
{
"path": "generated-entities/entities/items-item-entity.js",
"chars": 2414,
"preview": "/**\n *\n * Reldens - ItemsItemEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = req"
},
{
"path": "generated-entities/entities/items-item-modifiers-entity.js",
"chars": 1785,
"preview": "/**\n *\n * Reldens - ItemsItemModifiersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass It"
},
{
"path": "generated-entities/entities/items-types-entity.js",
"chars": 1099,
"preview": "/**\n *\n * Reldens - ItemsTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ItemsTypes"
},
{
"path": "generated-entities/entities/locale-entity.js",
"chars": 1306,
"preview": "/**\n *\n * Reldens - LocaleEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass LocaleEntity e"
},
{
"path": "generated-entities/entities/objects-animations-entity.js",
"chars": 1462,
"preview": "/**\n *\n * Reldens - ObjectsAnimationsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Obj"
},
{
"path": "generated-entities/entities/objects-assets-entity.js",
"chars": 1651,
"preview": "/**\n *\n * Reldens - ObjectsAssetsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Objects"
},
{
"path": "generated-entities/entities/objects-entity.js",
"chars": 2501,
"preview": "/**\n *\n * Reldens - ObjectsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = requi"
},
{
"path": "generated-entities/entities/objects-items-inventory-entity.js",
"chars": 1631,
"preview": "/**\n *\n * Reldens - ObjectsItemsInventoryEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass"
},
{
"path": "generated-entities/entities/objects-items-requirements-entity.js",
"chars": 1762,
"preview": "/**\n *\n * Reldens - ObjectsItemsRequirementsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\ncl"
},
{
"path": "generated-entities/entities/objects-items-rewards-entity.js",
"chars": 1738,
"preview": "/**\n *\n * Reldens - ObjectsItemsRewardsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass O"
},
{
"path": "generated-entities/entities/objects-skills-entity.js",
"chars": 1477,
"preview": "/**\n *\n * Reldens - ObjectsSkillsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Objects"
},
{
"path": "generated-entities/entities/objects-stats-entity.js",
"chars": 1550,
"preview": "/**\n *\n * Reldens - ObjectsStatsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ObjectsS"
},
{
"path": "generated-entities/entities/objects-types-entity.js",
"chars": 1107,
"preview": "/**\n *\n * Reldens - ObjectsTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ObjectsT"
},
{
"path": "generated-entities/entities/operation-types-entity.js",
"chars": 1213,
"preview": "/**\n *\n * Reldens - OperationTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Operat"
},
{
"path": "generated-entities/entities/players-entity.js",
"chars": 1517,
"preview": "/**\n *\n * Reldens - PlayersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = requi"
},
{
"path": "generated-entities/entities/players-state-entity.js",
"chars": 1639,
"preview": "/**\n *\n * Reldens - PlayersStateEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass PlayersS"
},
{
"path": "generated-entities/entities/players-stats-entity.js",
"chars": 1550,
"preview": "/**\n *\n * Reldens - PlayersStatsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass PlayersS"
},
{
"path": "generated-entities/entities/respawn-entity.js",
"chars": 1661,
"preview": "/**\n *\n * Reldens - RespawnEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = requi"
},
{
"path": "generated-entities/entities/rewards-entity.js",
"chars": 2347,
"preview": "/**\n *\n * Reldens - RewardsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = requi"
},
{
"path": "generated-entities/entities/rewards-events-entity.js",
"chars": 1942,
"preview": "/**\n *\n * Reldens - RewardsEventsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Rewards"
},
{
"path": "generated-entities/entities/rewards-events-state-entity.js",
"chars": 1497,
"preview": "/**\n *\n * Reldens - RewardsEventsStateEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Re"
},
{
"path": "generated-entities/entities/rewards-modifiers-entity.js",
"chars": 1821,
"preview": "/**\n *\n * Reldens - RewardsModifiersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Rewa"
},
{
"path": "generated-entities/entities/rooms-change-points-entity.js",
"chars": 1439,
"preview": "/**\n *\n * Reldens - RoomsChangePointsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Roo"
},
{
"path": "generated-entities/entities/rooms-entity.js",
"chars": 1999,
"preview": "/**\n *\n * Reldens - RoomsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require"
},
{
"path": "generated-entities/entities/rooms-return-points-entity.js",
"chars": 1740,
"preview": "/**\n *\n * Reldens - RoomsReturnPointsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Roo"
},
{
"path": "generated-entities/entities/scores-detail-entity.js",
"chars": 1569,
"preview": "/**\n *\n * Reldens - ScoresDetailEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ScoresDe"
},
{
"path": "generated-entities/entities/scores-entity.js",
"chars": 2006,
"preview": "/**\n *\n * Reldens - ScoresEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = requir"
},
{
"path": "generated-entities/entities/skills-class-level-up-animations-entity.js",
"chars": 1523,
"preview": "/**\n *\n * Reldens - SkillsClassLevelUpAnimationsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');"
},
{
"path": "generated-entities/entities/skills-class-path-entity.js",
"chars": 1741,
"preview": "/**\n *\n * Reldens - SkillsClassPathEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc }"
},
{
"path": "generated-entities/entities/skills-class-path-level-labels-entity.js",
"chars": 1538,
"preview": "/**\n *\n * Reldens - SkillsClassPathLevelLabelsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\n"
},
{
"path": "generated-entities/entities/skills-class-path-level-skills-entity.js",
"chars": 1541,
"preview": "/**\n *\n * Reldens - SkillsClassPathLevelSkillsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\n"
},
{
"path": "generated-entities/entities/skills-groups-entity.js",
"chars": 1418,
"preview": "/**\n *\n * Reldens - SkillsGroupsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsGr"
},
{
"path": "generated-entities/entities/skills-levels-entity.js",
"chars": 1544,
"preview": "/**\n *\n * Reldens - SkillsLevelsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsLe"
},
{
"path": "generated-entities/entities/skills-levels-modifiers-conditions-entity.js",
"chars": 1973,
"preview": "/**\n *\n * Reldens - SkillsLevelsModifiersConditionsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage"
},
{
"path": "generated-entities/entities/skills-levels-modifiers-entity.js",
"chars": 2023,
"preview": "/**\n *\n * Reldens - SkillsLevelsModifiersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass"
},
{
"path": "generated-entities/entities/skills-levels-set-entity.js",
"chars": 1644,
"preview": "/**\n *\n * Reldens - SkillsLevelsSetEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc }"
},
{
"path": "generated-entities/entities/skills-owners-class-path-entity.js",
"chars": 1548,
"preview": "/**\n *\n * Reldens - SkillsOwnersClassPathEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass"
},
{
"path": "generated-entities/entities/skills-skill-animations-entity.js",
"chars": 1620,
"preview": "/**\n *\n * Reldens - SkillsSkillAnimationsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass"
},
{
"path": "generated-entities/entities/skills-skill-attack-entity.js",
"chars": 2664,
"preview": "/**\n *\n * Reldens - SkillsSkillAttackEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc"
},
{
"path": "generated-entities/entities/skills-skill-entity.js",
"chars": 3372,
"preview": "/**\n *\n * Reldens - SkillsSkillEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = r"
},
{
"path": "generated-entities/entities/skills-skill-group-relation-entity.js",
"chars": 1342,
"preview": "/**\n *\n * Reldens - SkillsSkillGroupRelationEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\ncl"
},
{
"path": "generated-entities/entities/skills-skill-owner-conditions-entity.js",
"chars": 1989,
"preview": "/**\n *\n * Reldens - SkillsSkillOwnerConditionsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\n"
},
{
"path": "generated-entities/entities/skills-skill-owner-effects-conditions-entity.js",
"chars": 2044,
"preview": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsConditionsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/stora"
},
{
"path": "generated-entities/entities/skills-skill-owner-effects-entity.js",
"chars": 2098,
"preview": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\ncla"
},
{
"path": "generated-entities/entities/skills-skill-physical-data-entity.js",
"chars": 1686,
"preview": "/**\n *\n * Reldens - SkillsSkillPhysicalDataEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\ncla"
},
{
"path": "generated-entities/entities/skills-skill-target-effects-conditions-entity.js",
"chars": 2050,
"preview": "/**\n *\n * Reldens - SkillsSkillTargetEffectsConditionsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/stor"
},
{
"path": "generated-entities/entities/skills-skill-target-effects-entity.js",
"chars": 2102,
"preview": "/**\n *\n * Reldens - SkillsSkillTargetEffectsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\ncl"
},
{
"path": "generated-entities/entities/skills-skill-type-entity.js",
"chars": 1119,
"preview": "/**\n *\n * Reldens - SkillsSkillTypeEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass Skill"
},
{
"path": "generated-entities/entities/snippets-entity.js",
"chars": 1730,
"preview": "/**\n *\n * Reldens - SnippetsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = requ"
},
{
"path": "generated-entities/entities/stats-entity.js",
"chars": 1869,
"preview": "/**\n *\n * Reldens - StatsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require"
},
{
"path": "generated-entities/entities/target-options-entity.js",
"chars": 1121,
"preview": "/**\n *\n * Reldens - TargetOptionsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass TargetO"
},
{
"path": "generated-entities/entities/users-entity.js",
"chars": 2074,
"preview": "/**\n *\n * Reldens - UsersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require"
},
{
"path": "generated-entities/entities/users-locale-entity.js",
"chars": 1208,
"preview": "/**\n *\n * Reldens - UsersLocaleEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass UsersLoca"
},
{
"path": "generated-entities/entities/users-login-entity.js",
"chars": 1319,
"preview": "/**\n *\n * Reldens - UsersLoginEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass UsersLogin"
},
{
"path": "generated-entities/entities-config.js",
"chars": 10873,
"preview": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { AdsBannerEntity } = require('./entities/ads-banner-entity');\nconst {"
},
{
"path": "generated-entities/entities-translations.js",
"chars": 24157,
"preview": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n labels: {\n 'ads_ban"
},
{
"path": "generated-entities/models/mikro-orm/ads-banner-model.js",
"chars": 1109,
"preview": "/**\n *\n * Reldens - AdsBannerModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } "
},
{
"path": "generated-entities/models/mikro-orm/ads-event-video-model.js",
"chars": 1236,
"preview": "/**\n *\n * Reldens - AdsEventVideoModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchem"
},
{
"path": "generated-entities/models/mikro-orm/ads-model.js",
"chars": 3132,
"preview": "/**\n *\n * Reldens - AdsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = Mikr"
},
{
"path": "generated-entities/models/mikro-orm/ads-played-model.js",
"chars": 1658,
"preview": "/**\n *\n * Reldens - AdsPlayedModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } "
},
{
"path": "generated-entities/models/mikro-orm/ads-providers-model.js",
"chars": 919,
"preview": "/**\n *\n * Reldens - AdsProvidersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema"
},
{
"path": "generated-entities/models/mikro-orm/ads-types-model.js",
"chars": 779,
"preview": "/**\n *\n * Reldens - AdsTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } ="
},
{
"path": "generated-entities/models/mikro-orm/audio-categories-model.js",
"chars": 1704,
"preview": "/**\n *\n * Reldens - AudioCategoriesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySch"
},
{
"path": "generated-entities/models/mikro-orm/audio-markers-model.js",
"chars": 1437,
"preview": "/**\n *\n * Reldens - AudioMarkersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema"
},
{
"path": "generated-entities/models/mikro-orm/audio-model.js",
"chars": 2297,
"preview": "/**\n *\n * Reldens - AudioModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = Mi"
},
{
"path": "generated-entities/models/mikro-orm/audio-player-config-model.js",
"chars": 1664,
"preview": "/**\n *\n * Reldens - AudioPlayerConfigModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntityS"
},
{
"path": "generated-entities/models/mikro-orm/chat-message-types-model.js",
"chars": 1509,
"preview": "/**\n *\n * Reldens - ChatMessageTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySc"
},
{
"path": "generated-entities/models/mikro-orm/chat-model.js",
"chars": 2638,
"preview": "/**\n *\n * Reldens - ChatModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = Mik"
},
{
"path": "generated-entities/models/mikro-orm/clan-levels-model.js",
"chars": 1232,
"preview": "/**\n *\n * Reldens - ClanLevelsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema }"
},
{
"path": "generated-entities/models/mikro-orm/clan-levels-modifiers-model.js",
"chars": 2342,
"preview": "/**\n *\n * Reldens - ClanLevelsModifiersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { Entit"
},
{
"path": "generated-entities/models/mikro-orm/clan-members-model.js",
"chars": 1438,
"preview": "/**\n *\n * Reldens - ClanMembersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema "
},
{
"path": "generated-entities/models/mikro-orm/clan-model.js",
"chars": 1983,
"preview": "/**\n *\n * Reldens - ClanModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = Mik"
},
{
"path": "generated-entities/models/mikro-orm/config-model.js",
"chars": 1234,
"preview": "/**\n *\n * Reldens - ConfigModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = M"
},
{
"path": "generated-entities/models/mikro-orm/config-types-model.js",
"chars": 818,
"preview": "/**\n *\n * Reldens - ConfigTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema "
},
{
"path": "generated-entities/models/mikro-orm/drops-animations-model.js",
"chars": 1517,
"preview": "/**\n *\n * Reldens - DropsAnimationsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySch"
},
{
"path": "generated-entities/models/mikro-orm/features-model.js",
"chars": 865,
"preview": "/**\n *\n * Reldens - FeaturesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } ="
},
{
"path": "generated-entities/models/mikro-orm/items-group-model.js",
"chars": 1540,
"preview": "/**\n *\n * Reldens - ItemsGroupModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema }"
},
{
"path": "generated-entities/models/mikro-orm/items-inventory-model.js",
"chars": 1836,
"preview": "/**\n *\n * Reldens - ItemsInventoryModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySche"
},
{
"path": "generated-entities/models/mikro-orm/items-item-model.js",
"chars": 4207,
"preview": "/**\n *\n * Reldens - ItemsItemModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } "
},
{
"path": "generated-entities/models/mikro-orm/items-item-modifiers-model.js",
"chars": 1951,
"preview": "/**\n *\n * Reldens - ItemsItemModifiersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { Entity"
},
{
"path": "generated-entities/models/mikro-orm/items-types-model.js",
"chars": 806,
"preview": "/**\n *\n * Reldens - ItemsTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema }"
},
{
"path": "generated-entities/models/mikro-orm/locale-model.js",
"chars": 1324,
"preview": "/**\n *\n * Reldens - LocaleModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = M"
},
{
"path": "generated-entities/models/mikro-orm/objects-animations-model.js",
"chars": 1335,
"preview": "/**\n *\n * Reldens - ObjectsAnimationsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntityS"
},
{
"path": "generated-entities/models/mikro-orm/objects-assets-model.js",
"chars": 1609,
"preview": "/**\n *\n * Reldens - ObjectsAssetsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchem"
},
{
"path": "generated-entities/models/mikro-orm/objects-items-inventory-model.js",
"chars": 1879,
"preview": "/**\n *\n * Reldens - ObjectsItemsInventoryModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { Ent"
},
{
"path": "generated-entities/models/mikro-orm/objects-items-requirements-model.js",
"chars": 2482,
"preview": "/**\n *\n * Reldens - ObjectsItemsRequirementsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { "
},
{
"path": "generated-entities/models/mikro-orm/objects-items-rewards-model.js",
"chars": 2420,
"preview": "/**\n *\n * Reldens - ObjectsItemsRewardsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { Entit"
},
{
"path": "generated-entities/models/mikro-orm/objects-model.js",
"chars": 4125,
"preview": "/**\n *\n * Reldens - ObjectsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = "
},
{
"path": "generated-entities/models/mikro-orm/objects-skills-model.js",
"chars": 1939,
"preview": "/**\n *\n * Reldens - ObjectsSkillsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchem"
},
{
"path": "generated-entities/models/mikro-orm/objects-stats-model.js",
"chars": 1646,
"preview": "/**\n *\n * Reldens - ObjectsStatsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema"
},
{
"path": "generated-entities/models/mikro-orm/objects-types-model.js",
"chars": 815,
"preview": "/**\n *\n * Reldens - ObjectsTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema"
},
{
"path": "generated-entities/models/mikro-orm/operation-types-model.js",
"chars": 1835,
"preview": "/**\n *\n * Reldens - OperationTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySche"
},
{
"path": "generated-entities/models/mikro-orm/players-model.js",
"chars": 3288,
"preview": "/**\n *\n * Reldens - PlayersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = "
},
{
"path": "generated-entities/models/mikro-orm/players-state-model.js",
"chars": 1640,
"preview": "/**\n *\n * Reldens - PlayersStateModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema"
},
{
"path": "generated-entities/models/mikro-orm/players-stats-model.js",
"chars": 1646,
"preview": "/**\n *\n * Reldens - PlayersStatsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema"
},
{
"path": "generated-entities/models/mikro-orm/registered-models-mikro-orm.js",
"chars": 8480,
"preview": "/**\n *\n * Reldens - Registered Models\n *\n */\n\nconst adsBannerModel = require('./ads-banner-model');\nconst adsModel = req"
},
{
"path": "generated-entities/models/mikro-orm/respawn-model.js",
"chars": 1658,
"preview": "/**\n *\n * Reldens - RespawnModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = "
},
{
"path": "generated-entities/models/mikro-orm/rewards-events-model.js",
"chars": 1822,
"preview": "/**\n *\n * Reldens - RewardsEventsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchem"
},
{
"path": "generated-entities/models/mikro-orm/rewards-events-state-model.js",
"chars": 1699,
"preview": "/**\n *\n * Reldens - RewardsEventsStateModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { Entity"
},
{
"path": "generated-entities/models/mikro-orm/rewards-model.js",
"chars": 2934,
"preview": "/**\n *\n * Reldens - RewardsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = "
},
{
"path": "generated-entities/models/mikro-orm/rewards-modifiers-model.js",
"chars": 2040,
"preview": "/**\n *\n * Reldens - RewardsModifiersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySc"
},
{
"path": "generated-entities/models/mikro-orm/rooms-change-points-model.js",
"chars": 1639,
"preview": "/**\n *\n * Reldens - RoomsChangePointsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntityS"
},
{
"path": "generated-entities/models/mikro-orm/rooms-model.js",
"chars": 2874,
"preview": "/**\n *\n * Reldens - RoomsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = Mi"
},
{
"path": "generated-entities/models/mikro-orm/rooms-return-points-model.js",
"chars": 1882,
"preview": "/**\n *\n * Reldens - RoomsReturnPointsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntityS"
},
{
"path": "generated-entities/models/mikro-orm/scores-detail-model.js",
"chars": 1597,
"preview": "/**\n *\n * Reldens - ScoresDetailModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema"
},
{
"path": "generated-entities/models/mikro-orm/scores-model.js",
"chars": 2074,
"preview": "/**\n *\n * Reldens - ScoresModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = M"
},
{
"path": "generated-entities/models/mikro-orm/skills-class-level-up-animations-model.js",
"chars": 1783,
"preview": "/**\n *\n * Reldens - SkillsClassLevelUpAnimationsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\ncons"
},
{
"path": "generated-entities/models/mikro-orm/skills-class-path-level-labels-model.js",
"chars": 1725,
"preview": "/**\n *\n * Reldens - SkillsClassPathLevelLabelsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst "
},
{
"path": "generated-entities/models/mikro-orm/skills-class-path-level-skills-model.js",
"chars": 2076,
"preview": "/**\n *\n * Reldens - SkillsClassPathLevelSkillsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst "
},
{
"path": "generated-entities/models/mikro-orm/skills-class-path-model.js",
"chars": 2431,
"preview": "/**\n *\n * Reldens - SkillsClassPathModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySch"
},
{
"path": "generated-entities/models/mikro-orm/skills-groups-model.js",
"chars": 1150,
"preview": "/**\n *\n * Reldens - SkillsGroupsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema"
},
{
"path": "generated-entities/models/mikro-orm/skills-levels-model.js",
"chars": 2187,
"preview": "/**\n *\n * Reldens - SkillsLevelsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema"
},
{
"path": "generated-entities/models/mikro-orm/skills-levels-modifiers-conditions-model.js",
"chars": 1281,
"preview": "/**\n *\n * Reldens - SkillsLevelsModifiersConditionsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nc"
},
{
"path": "generated-entities/models/mikro-orm/skills-levels-modifiers-model.js",
"chars": 2362,
"preview": "/**\n *\n * Reldens - SkillsLevelsModifiersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { Ent"
},
{
"path": "generated-entities/models/mikro-orm/skills-levels-set-model.js",
"chars": 1780,
"preview": "/**\n *\n * Reldens - SkillsLevelsSetModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySch"
},
{
"path": "generated-entities/models/mikro-orm/skills-owners-class-path-model.js",
"chars": 1860,
"preview": "/**\n *\n * Reldens - SkillsOwnersClassPathModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { Ent"
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-animations-model.js",
"chars": 1434,
"preview": "/**\n *\n * Reldens - SkillsSkillAnimationsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { Ent"
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-attack-model.js",
"chars": 3024,
"preview": "/**\n *\n * Reldens - SkillsSkillAttackModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntityS"
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-group-relation-model.js",
"chars": 1570,
"preview": "/**\n *\n * Reldens - SkillsSkillGroupRelationModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { "
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-model.js",
"chars": 5301,
"preview": "/**\n *\n * Reldens - SkillsSkillModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema "
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-owner-conditions-model.js",
"chars": 1548,
"preview": "/**\n *\n * Reldens - SkillsSkillOwnerConditionsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst "
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-owner-effects-conditions-model.js",
"chars": 1747,
"preview": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsConditionsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');"
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-owner-effects-model.js",
"chars": 2553,
"preview": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { E"
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-physical-data-model.js",
"chars": 1663,
"preview": "/**\n *\n * Reldens - SkillsSkillPhysicalDataModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { E"
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-target-effects-conditions-model.js",
"chars": 1765,
"preview": "/**\n *\n * Reldens - SkillsSkillTargetEffectsConditionsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage')"
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-target-effects-model.js",
"chars": 2562,
"preview": "/**\n *\n * Reldens - SkillsSkillTargetEffectsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { "
},
{
"path": "generated-entities/models/mikro-orm/skills-skill-type-model.js",
"chars": 847,
"preview": "/**\n *\n * Reldens - SkillsSkillTypeModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySch"
},
{
"path": "generated-entities/models/mikro-orm/snippets-model.js",
"chars": 1430,
"preview": "/**\n *\n * Reldens - SnippetsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } ="
},
{
"path": "generated-entities/models/mikro-orm/stats-model.js",
"chars": 1627,
"preview": "/**\n *\n * Reldens - StatsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = Mi"
},
{
"path": "generated-entities/models/mikro-orm/target-options-model.js",
"chars": 1019,
"preview": "/**\n *\n * Reldens - TargetOptionsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchem"
},
{
"path": "generated-entities/models/mikro-orm/users-locale-model.js",
"chars": 1436,
"preview": "/**\n *\n * Reldens - UsersLocaleModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema "
},
{
"path": "generated-entities/models/mikro-orm/users-login-model.js",
"chars": 1273,
"preview": "/**\n *\n * Reldens - UsersLoginModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema }"
},
{
"path": "generated-entities/models/mikro-orm/users-model.js",
"chars": 1984,
"preview": "/**\n *\n * Reldens - UsersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = Mi"
},
{
"path": "generated-entities/models/objection-js/ads-banner-model.js",
"chars": 679,
"preview": "/**\n *\n * Reldens - AdsBannerModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsBanner"
},
{
"path": "generated-entities/models/objection-js/ads-event-video-model.js",
"chars": 700,
"preview": "/**\n *\n * Reldens - AdsEventVideoModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsEv"
},
{
"path": "generated-entities/models/objection-js/ads-model.js",
"chars": 2145,
"preview": "/**\n *\n * Reldens - AdsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsModel extend"
},
{
"path": "generated-entities/models/objection-js/ads-played-model.js",
"chars": 1031,
"preview": "/**\n *\n * Reldens - AdsPlayedModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsPlayed"
},
{
"path": "generated-entities/models/objection-js/ads-providers-model.js",
"chars": 694,
"preview": "/**\n *\n * Reldens - AdsProvidersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsPro"
},
{
"path": "generated-entities/models/objection-js/ads-types-model.js",
"chars": 670,
"preview": "/**\n *\n * Reldens - AdsTypesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsTypesMo"
},
{
"path": "generated-entities/models/objection-js/audio-categories-model.js",
"chars": 1122,
"preview": "/**\n *\n * Reldens - AudioCategoriesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass Aud"
},
{
"path": "generated-entities/models/objection-js/audio-markers-model.js",
"chars": 706,
"preview": "/**\n *\n * Reldens - AudioMarkersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AudioM"
},
{
"path": "generated-entities/models/objection-js/audio-model.js",
"chars": 1438,
"preview": "/**\n *\n * Reldens - AudioModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AudioModel ex"
},
{
"path": "generated-entities/models/objection-js/audio-player-config-model.js",
"chars": 1139,
"preview": "/**\n *\n * Reldens - AudioPlayerConfigModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass A"
},
{
"path": "generated-entities/models/objection-js/chat-message-types-model.js",
"chars": 1130,
"preview": "/**\n *\n * Reldens - ChatMessageTypesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass Ch"
},
{
"path": "generated-entities/models/objection-js/chat-model.js",
"chars": 1741,
"preview": "/**\n *\n * Reldens - ChatModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ChatModel exte"
},
{
"path": "generated-entities/models/objection-js/clan-levels-model.js",
"chars": 1094,
"preview": "/**\n *\n * Reldens - ClanLevelsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ClanLeve"
},
{
"path": "generated-entities/models/objection-js/clan-levels-modifiers-model.js",
"chars": 1159,
"preview": "/**\n *\n * Reldens - ClanLevelsModifiersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass"
},
{
"path": "generated-entities/models/objection-js/clan-members-model.js",
"chars": 1047,
"preview": "/**\n *\n * Reldens - ClanMembersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ClanMem"
},
{
"path": "generated-entities/models/objection-js/clan-model.js",
"chars": 1408,
"preview": "/**\n *\n * Reldens - ClanModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ClanModel exte"
},
{
"path": "generated-entities/models/objection-js/config-model.js",
"chars": 703,
"preview": "/**\n *\n * Reldens - ConfigModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ConfigModel "
},
{
"path": "generated-entities/models/objection-js/config-types-model.js",
"chars": 697,
"preview": "/**\n *\n * Reldens - ConfigTypesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ConfigT"
}
]
// ... and 791 more files (download for full content)
About this extraction
This page contains the full source code of the damian-pastorini/reldens GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 991 files (5.4 MB), approximately 1.5M tokens, and a symbol index with 3727 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.