npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@dcl-sdk/mini-games

v1.0.3

Published

SDK7 Library to handle Players Queue logic for Multiplayers Game

Downloads

515

Readme

SDK Mini Games Library

Step 1: Install & Init Library

Install @dcl-sdk/mini-games Library in your scene

// Run the following command in the scene terminal
npm install @dcl-sdk/mini-games@next

Copy all the assets needed for the UI, Scoreboard and other models inside your scene.

// Run the following command in the scene terminal
node ./node_modules/@dcl-sdk/mini-games/scripts/postinstall.js
// This will create the `mini-games-assets` folder inside your scene with all the models that the library uses.

Import Mini Games library in your scene

// game.ts file
import { initLibrary } from '@dcl-sdk/mini-games/src'
import { syncEntity } from '@dcl/sdk/network'
import players from '@dcl/sdk/players'

// make sure to put this line outside the main function.
initLibrary(engine, syncEntity, players, {
  environment: 'dev',
  gameId: 'game-id-here'
})

function main() {
  // code scene here
}

Step 2: Players queue

The library provides all the logic behind to handle the multiplayers queue.

Queue Players Functions

import { queue } from '@dcl-sdk/mini-games/src'

queue.addPlayer(): void

Adds the current player to the queue if they're not already in it.

queue.setNextPlayer(): void

Removes current player from the queue (if its the active one), and set the next player in the queue as active.

queue.isActive(): boolean

Checks if the current user is the active player.

queue.getQueue(): Player[]

Returns an array of players in the queue, sorted by the ime they join the queue.

queue.initQueueDisplay(displayTransform: TransformType): void

Create a display on the scene that informs the player the current status of the queue. After installing the library needs to place display glb model in mini-game-assets/models/queueDisplay/workstation_display.glb

Listener for active player updates

listeners.onActivePlayerChange

Player Type

type PlayerType = {
  address: string;
  joinedAt: number;
  startPlayingAt: number;
  active: boolean;
}

Step 3: Scene Rotation + Game Area Checker + Timeout

Scene Rotation

Set the orientation of the scene. You can set any number but ideally you want to set 0, 90, 180 or 270. This would add a RootEntity and then you can parent all the entities to this root entity so they all point to the same orientation.

Game Area Check

You can define your play game area. So if the active player decides to leave the area, it switches automatically to the next player. Also if a player finds a way to enter the game area and is not the active player, it will be kicked out.

Timeout check

Set a max amout of time that a player can play the game without being kicked. If the player is alone in the game, it will continue playing till a new user arrives.

This can be done by passing extra params to the initLibrary

import { initLibrary, sceneParentEntity } from '@dcl-sdk/mini-games/src'
const _1_SEC = 1000
const _1_MIN = _1_SEC * 60

miniGames.initLibrary(engine as any, syncEntity, playersApi, {
    gameId: "4ee1d308-5e1e-4b2b-9e91-9091878a7e3d",
    environment: "dev",
    // time in ms
    gameTimeoutMs: _1_MIN,
    inactiveTimeoutMs: 20 * _1_SEC_,
    // game area rectangle
    gameArea: {
      // top left point
      topLeft: Vector3.create(5.15, 0, 2.23),
      // bottom right point
      bottomRight: Vector3.create(13.77, 0, 13.77),
      // point outside the game area to exit players
      exitSpawnPoint: Vector3.create(0,0,7)
    }
})
function main() {
  const gameArea = engine.addEntity()
  Transform.create(gameArea, { parent: sceneParentEntity, position, ...etc })
}

Step 4: UI

We already implement the generic UI to use inside the mini-games. Like the Play Game sign, Music On/Off, Levels, etc.

Menu Button UI

// MenuButton(position: TransformType, assetShape, assetIcon, hoverText, callback, enabledByDefault (optional), releaseTime (optional) )
import { ui } from '@dcl-sdk/mini-games/src'

// All the available icons
const icons = ui.uiAssets.icons
// All the available Shapes & Colors
const shapes = ui.uiAssets.shapes


new ui.MenuButton(
  {
    parent: sceneParentEntity,
    position: Vector3.create(-3.74, 1.03, 0),
    rotation: Quaternion.fromEulerDegrees(-45, 90, 0),
    scale: Vector3.create(1.2, 1.2, 1.2)
  },
  ui.uiAssets.shapes.RECT_GREEN,
  ui.uiAssets.icons.playText,
  "PLAY GAME",
  () => {
    queue.addPlayer()
  }
)

Step 5: Progress API

We manage all the Progress API for you. We use the gameId set on the initLibrary, so be sure to update this value !

Get last user progress of the game

type ProgressKey = 'level' | 'score' | 'moves' | 'time'
const userProgress = await progress.getProgress('level', progress.SortDirection.DESC, 1)

Upsert the user progress based on the game.

import { progress } from '@dcl-sdk/mini-games/src'

await progress.upsertProgress({
  level: gameData.currentLevel,
  time: gameData.levelFinishedAt - gameData.levelStartedAt,
  moves: gameData.moves
})

Step 6: ScoreBoard

Initialize the scoreboard and that's it !

// Add scoreboard
  const width = 2.5
  const height = 2.8
  const scale = 1.2
  new ui.ScoreBoard(
    {
      // parent: sideSignB,
      position: Vector3.create(1.3, 4, 0.15),
      rotation: Quaternion.fromEulerDegrees(0, 180, 0)
    },
    width,
    height,
    scale,
    ui.TIME_LEVEL
  )