Skip to content

Commit

Permalink
add owner paramter to inventory's item callback properties
Browse files Browse the repository at this point in the history
  • Loading branch information
izure committed Jun 30, 2021
1 parent bdc7104 commit 9e58eb4
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 23 deletions.
2 changes: 1 addition & 1 deletion inventory/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@eriengine/plugin-inventory",
"version": "1.0.0",
"version": "1.1.0",
"description": "Inventory system plugin for Phaser 3",
"main": "dist/inventory/src/eriengine-core-plugin-inventory.js",
"scripts": {
Expand Down
101 changes: 79 additions & 22 deletions inventory/src/eriengine-core-plugin-inventory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,52 +28,61 @@ export interface ItemBlueprint {
* 아이템을 인벤토리에 추가하기 전에, 호출될 콜백함수입니다.
* 이 함수는 아이템을 인벤토리에 추가하기 전에, 유효성을 검사하는 함수입니다.
* 이 함수에서 `true`를 반환한다면, 아이템은 인벤토리에 추가될 것입니다. 하지만 `false`를 반환한다면 아이템은 인벤토리에 추가되지 않습니다.
* 이 함수를 지정하지 않는다면, 유효성 검사는 항상 `true`를 반환할 것입니다.
* @param item 해당 아이템 인스턴스입니다.
* @param inventory 해당 아이템이 속한 인벤토리 인스턴스입니다.
* @param owner 아이템의 사용자입니다.
*/
onBeforeAdd?(item: ItemBlueprint, inventory: Inventory): Promise<boolean>
onBeforeAdd?(item: ItemBlueprint, inventory: Inventory, owner: any): Promise<boolean>

/**
* 아이템이 인벤토리에 추가됐을 때 호출될 콜백함수입니다.
* 이 함수는 `onBeforeAdd` 메서드의 유효성을 통과하고, 슬롯, 무게 제한을 통과한 이후에 실제로 인벤토리에 추가되었을 때만 호출됩니다.
* @param item 해당 아이템 인스턴스입니다.
* @param inventory 해당 아이템이 속한 인벤토리 인스턴스입니다.
* @param owner 아이템의 사용자입니다.
*/
onAdd(item: Item, inventory: Inventory): Promise<void>
onAdd(item: Item, inventory: Inventory, owner: any): Promise<void>

/**
* 아이템을 인벤토리에서 제거하기 전에, 호출될 콜백함수입니다.
* 이 함수는 아이템을 인벤토리에서 제거하기 전에, 유효성을 검사하는 함수입니다.
* 이 함수에서 `true`를 반환한다면, 아이템은 인벤토리에서 제거될 것입니다. 하지만 `false`를 반환한다면 아이템은 인벤토리에서 제거되지 않습니다.
* 이 함수를 지정하지 않는다면, 유효성 검사는 항상 `true`를 반환할 것입니다.
* @param item 해당 아이템 인스턴스입니다.
* @param inventory 해당 아이템이 속한 인벤토리 인스턴스입니다.
* @param owner 아이템의 사용자입니다.
*/
onBeforeDrop?(item: Item, inventory: Inventory): Promise<boolean>
onBeforeDrop?(item: Item, inventory: Inventory, owner: any): Promise<boolean>

/**
* 아이템을 인벤토리에서 제거했을 때, 호출될 콜백함수입니다.
* 이 함수는 `onBeforeDrop` 메서드의 유효성을 통과한 이후에 실제로 인벤토리에서 제거되었을 때만 호출됩니다.
* @param item 해당 아이템 인스턴스입니다.
* @param inventory 해당 아이템이 속했던 인벤토리 인스턴스입니다.
* @param owner 아이템의 사용자입니다.
*/
onDrop(item: Item, inventory: Inventory): Promise<void>
onDrop(item: Item, inventory: Inventory, owner: any): Promise<void>

/**
* 아이템을 사용하기 전에, 호출될 콜백함수입니다.
* 이 함수는 아이템을 사용하기 전에, 유효성을 검사하는 함수입니다.
* 이 함수에서 `true`를 반환한다면, 아이템은 사용될 것입니다. 하지만 `false`를 반환한다면 아이템은 사용되지 않습니다.
* 이 함수를 지정하지 않는다면, 유효성 검사는 항상 `true`를 반환할 것입니다.
* @param item 해당 아이템 인스턴스입니다.
* @param inventory 해당 아이템이 속한 인벤토리 인스턴스입니다.
* @param owner 아이템의 사용자입니다.
*/
onBeforeUse?(item: Item, inventory: Inventory): Promise<boolean>
onBeforeUse?(item: Item, inventory: Inventory, owner: any): Promise<boolean>

/**
* 아이템을 사용했을 때, 호출될 콜백함수입니다.
* 이 함수는 `onBeforeUse` 메서드의 유효성을 통과한 이후에 실제로 사용되었을 때만 호출됩니다.
* @param item 해당 아이템 인스턴스입니다.
* @param inventory 해당 아이템이 속했던 인벤토리 인스턴스입니다.
* @param owner 아이템의 사용자입니다.
*/
onUse(item: Item, inventory: Inventory): Promise<void>
onUse(item: Item, inventory: Inventory, owner: any): Promise<void>
}

export class Item {
Expand Down Expand Up @@ -103,12 +112,14 @@ export class Item {
export class Inventory {
private readonly __items: Item[] = []
private readonly __inventoryManager: Plugin
private readonly __owner: any

private maximumWeight: number = Infinity
private maximumSlot: number = Infinity

constructor(inventoryManager: Plugin) {
constructor(inventoryManager: Plugin, owner: any) {
this.__inventoryManager = inventoryManager
this.__owner = owner
}

/**
Expand All @@ -118,6 +129,13 @@ export class Inventory {
return this.__items
}

/**
* 현재 인벤토리의 소유자입니다.
*/
get owner(): any {
return this.__owner
}

/**
* 현재 인벤토리에 저장된 모든 아이템의 무게를 총합하여 반환합니다.
*/
Expand Down Expand Up @@ -207,38 +225,63 @@ export class Inventory {
return true
}

// 인벤토리에 아이템을 가지고 있는지 여부를 반환
/**
* 현재 인벤토리에 아이템을 가지고 있는 여부를 반환합니다.
* @param key 아이템의 고유 키값입니다.
*/
has(key: string): boolean {
return this.get(key).length !== 0
}

// 인벤토리에 있는 아이템을 키값으로 검색하여 배열에 담아 반환
/**
* 현재 인벤토리에 찾고자 하는 아이템 목록을 배열에 담아 반환합니다.
* @param key 찾고자 하는 아이템의 고유 키값입니다.
*/
get(key: string): Item[] {
return this.__items.filter((item) => item.key === key)
}

// 인벤토리의 아이템을 이름 순으로 정렬
/**
* 현재 인벤토리의 아이템을 `이름(name)` 순으로 정렬합니다.
* 이는 `this.items` 속성을 위해 사용됩니다.
* @param desc 이 값을 `true`로 설정하면 내림차순으로 정렬합니다. 기본값은 `false`입니다.
*/
sortByName(desc: boolean = false): this {
const sortBy = desc ? -1 : 1
this.__items.sort((a, b) => a.blueprint.name.localeCompare(b.blueprint.name) * sortBy)
return this
}

// 인벤토리 아이템을 추가한 시간 순으로 정렬
/**
* 현재 인벤토리의 아이템을 `추가된(regdate)` 순으로 정렬합니다.
* 이는 `this.items` 속성을 위해 사용됩니다.
* @param desc 이 값을 `true`로 설정하면 내림차순으로 정렬합니다. 기본값은 `false`입니다.
*/
sortByAdded(desc: boolean = false): this {
const sortBy = desc ? -1 : 1
this.__items.sort((a, b) => (a.regdate - b.regdate) * sortBy)
return this
}

// 인벤토리 아이템을 무게 순으로 정렬
/**
* 현재 인벤토리의 아이템을 `무게(weight)` 순으로 정렬합니다.
* 이는 `this.items` 속성을 위해 사용됩니다.
* @param desc 이 값을 `true`로 설정하면 내림차순으로 정렬합니다. 기본값은 `false`입니다.
*/
sortByWeight(desc: boolean = false): this {
const sortBy = desc ? -1 : 1
this.__items.sort((a, b) => (a.blueprint.weight - b.blueprint.weight) * sortBy)
return this
}

// 인벤토리에 아이템을 추가.
/**
* 현재 인벤토리에 아이템을 추가합니다.
* 추가하고자하는 아이템은 인벤토리 플러그인에서 `addItemBlueprint` 메서드로 등록한 아이템이여야 합니다.
* 이 메서드는 아이템의 `onBeforeAdd` 콜백함수의 영향을 받으며, `onBeforeAdd` 콜백함수가 `false`를 반환한다면 아이템을 추가하지 않습니다.
* `onBeforeAdd` 유효성 검사를 통과하더라도, 인벤토리의 `무게 제한(maximumWeight)`, `슬롯 제한(maximumSlot)`에 제한되면 추가하지 않습니다.
* @param key 추가할 아이템의 고유 키값입니다.
* @returns 인벤토리에 아이템 추가 성공 여부를 반환합니다.
*/
async add(key: string): Promise<boolean> {
if (!this.__inventoryManager.hasItemBlueprint(key)) {
return false
Expand All @@ -248,7 +291,7 @@ export class Inventory {
const blueprint = this.__inventoryManager.getItemBlueprint(key)!
if (
blueprint.onBeforeAdd &&
!await blueprint.onBeforeAdd(blueprint, this)
!await blueprint.onBeforeAdd(blueprint, this, this.__owner)
) {
return false
}
Expand All @@ -261,12 +304,19 @@ export class Inventory {
const item = this.createItem(blueprint)
this.__items.push(item)

blueprint.onAdd(item, this)
blueprint.onAdd(item, this, this.__owner)

return true
}

// 인벤토리에서 아이템을 제거.
/**
* 현재 인벤토리에서 아이템을 제거합니다.
* 제거하고자하는 아이템은 인벤토리 플러그인에서 `addItemBlueprint` 메서드로 등록한 아이템이여야 합니다.
* 이 메서드는 아이템의 `onBeforeDrop` 콜백함수의 영향을 받으며, `onBeforeDrop` 콜백함수가 `false`를 반환한다면 아이템을 제거하지 않습니다.
* 인벤토리에 아이템이 존재하지 않는다면 `false`를 반환합니다.
* @param key 제거할 아이템의 고유 키값입니다.
* @returns 인벤토리에서 아이템 제거 성공 여부를 반환합니다.
*/
async drop(key: string): Promise<boolean> {
if (!this.__inventoryManager.hasItemBlueprint(key)) {
return false
Expand All @@ -282,20 +332,27 @@ export class Inventory {
const oldest = this.get(key)[0]
if (
blueprint.onBeforeDrop &&
!await blueprint.onBeforeDrop(oldest, this)
!await blueprint.onBeforeDrop(oldest, this, this.__owner)
) {
return false
}

const index = this.__items.indexOf(oldest)
this.__items.splice(index, 1)

blueprint.onDrop(oldest, this)
blueprint.onDrop(oldest, this, this.__owner)

return true
}

// 인벤토리에 있는 아이템을 사용.
/**
* 현재 인벤토리에 있는 아이템을 사용합니다.
* 사용하고자하는 아이템은 인벤토리 플러그인에서 `addItemBlueprint` 메서드로 등록한 아이템이여야 합니다.
* 이 메서드는 아이템의 `onBeforeUse` 콜백함수의 영향을 받으며, `onBeforeUse` 콜백함수가 `false`를 반환한다면 아이템을 사용하지 않습니다.
* 인벤토리에 아이템이 존재하지 않는다면 `false`를 반환합니다.
* @param key 사용할 아이템의 고유 키값입니다.
* @returns 아이템 사용 성공 여부를 반환합니다.
*/
async use(key: string): Promise<boolean> {
if (!this.__inventoryManager.hasItemBlueprint(key)) {
return false
Expand All @@ -311,7 +368,7 @@ export class Inventory {
const oldest = this.get(key)[0]
if (
blueprint.onBeforeUse &&
!await blueprint.onBeforeUse(oldest, this)
!await blueprint.onBeforeUse(oldest, this, this.__owner)
) {
return false
}
Expand All @@ -322,7 +379,7 @@ export class Inventory {
this.__items.splice(index, 1)
}

blueprint.onUse(oldest, this)
blueprint.onUse(oldest, this, this.__owner)

return true
}
Expand Down Expand Up @@ -355,7 +412,7 @@ export class Plugin extends Phaser.Plugins.ScenePlugin {
*/
of(owner: any): Inventory {
if (!this.__inventorys.has(owner)) {
this.__inventorys.set(owner, new Inventory(this))
this.__inventorys.set(owner, new Inventory(this, owner))
}
return this.__inventorys.get(owner)!
}
Expand Down

0 comments on commit 9e58eb4

Please sign in to comment.