Almost finalised refactoring
This commit is contained in:
parent
145143cdc5
commit
700bd57e67
@ -34,7 +34,7 @@ export type Tile = {
|
|||||||
updatedAt: Date
|
updatedAt: Date
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Object = {
|
export type MapObject = {
|
||||||
id: UUID
|
id: UUID
|
||||||
name: string
|
name: string
|
||||||
tags: any | null
|
tags: any | null
|
||||||
@ -46,7 +46,6 @@ export type Object = {
|
|||||||
frameHeight: number
|
frameHeight: number
|
||||||
createdAt: Date
|
createdAt: Date
|
||||||
updatedAt: Date
|
updatedAt: Date
|
||||||
MapObject: PlacedMapObject[]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Item = {
|
export type Item = {
|
||||||
@ -56,7 +55,6 @@ export type Item = {
|
|||||||
itemType: ItemType
|
itemType: ItemType
|
||||||
stackable: boolean
|
stackable: boolean
|
||||||
rarity: ItemRarity
|
rarity: ItemRarity
|
||||||
spriteId: UUID | null
|
|
||||||
sprite?: Sprite
|
sprite?: Sprite
|
||||||
createdAt: Date
|
createdAt: Date
|
||||||
updatedAt: Date
|
updatedAt: Date
|
||||||
@ -74,7 +72,7 @@ export type Map = {
|
|||||||
pvp: boolean
|
pvp: boolean
|
||||||
mapEffects: MapEffect[]
|
mapEffects: MapEffect[]
|
||||||
mapEventTiles: MapEventTile[]
|
mapEventTiles: MapEventTile[]
|
||||||
mapObjects: PlacedMapObject[]
|
placedMapObjects: PlacedMapObject[]
|
||||||
characters: Character[]
|
characters: Character[]
|
||||||
chats: Chat[]
|
chats: Chat[]
|
||||||
createdAt: Date
|
createdAt: Date
|
||||||
@ -83,7 +81,6 @@ export type Map = {
|
|||||||
|
|
||||||
export type MapEffect = {
|
export type MapEffect = {
|
||||||
id: UUID
|
id: UUID
|
||||||
mapId: UUID
|
|
||||||
map: Map
|
map: Map
|
||||||
effect: string
|
effect: string
|
||||||
strength: number
|
strength: number
|
||||||
@ -91,10 +88,8 @@ export type MapEffect = {
|
|||||||
|
|
||||||
export type PlacedMapObject = {
|
export type PlacedMapObject = {
|
||||||
id: UUID
|
id: UUID
|
||||||
mapId: UUID
|
|
||||||
map: Map
|
map: Map
|
||||||
objectId: UUID
|
mapObject: MapObject
|
||||||
object: Object
|
|
||||||
depth: number
|
depth: number
|
||||||
isRotated: boolean
|
isRotated: boolean
|
||||||
positionX: number
|
positionX: number
|
||||||
@ -110,7 +105,6 @@ export enum MapEventTileType {
|
|||||||
|
|
||||||
export type MapEventTile = {
|
export type MapEventTile = {
|
||||||
id: UUID
|
id: UUID
|
||||||
mapId: UUID
|
|
||||||
map: Map
|
map: Map
|
||||||
type: MapEventTileType
|
type: MapEventTileType
|
||||||
positionX: number
|
positionX: number
|
||||||
@ -120,7 +114,6 @@ export type MapEventTile = {
|
|||||||
|
|
||||||
export type MapEventTileTeleport = {
|
export type MapEventTileTeleport = {
|
||||||
id: UUID
|
id: UUID
|
||||||
mapEventTileId: UUID
|
|
||||||
mapEventTile: MapEventTile
|
mapEventTile: MapEventTile
|
||||||
toMapId: UUID
|
toMapId: UUID
|
||||||
toMap: Map
|
toMap: Map
|
||||||
@ -155,8 +148,6 @@ export type CharacterType = {
|
|||||||
gender: CharacterGender
|
gender: CharacterGender
|
||||||
race: CharacterRace
|
race: CharacterRace
|
||||||
isSelectable: boolean
|
isSelectable: boolean
|
||||||
characters: Character[]
|
|
||||||
spriteId?: string
|
|
||||||
sprite?: Sprite
|
sprite?: Sprite
|
||||||
createdAt: Date
|
createdAt: Date
|
||||||
updatedAt: Date
|
updatedAt: Date
|
||||||
@ -165,7 +156,7 @@ export type CharacterType = {
|
|||||||
export type CharacterHair = {
|
export type CharacterHair = {
|
||||||
id: UUID
|
id: UUID
|
||||||
name: string
|
name: string
|
||||||
sprite: Sprite
|
sprite?: Sprite
|
||||||
gender: CharacterGender
|
gender: CharacterGender
|
||||||
isSelectable: boolean
|
isSelectable: boolean
|
||||||
}
|
}
|
||||||
@ -184,9 +175,7 @@ export type Character = {
|
|||||||
positionX: number
|
positionX: number
|
||||||
positionY: number
|
positionY: number
|
||||||
rotation: number
|
rotation: number
|
||||||
characterTypeId: UUID | null
|
|
||||||
characterType: CharacterType | null | string
|
characterType: CharacterType | null | string
|
||||||
characterHairId: UUID | null
|
|
||||||
characterHair: CharacterHair | null
|
characterHair: CharacterHair | null
|
||||||
mapId: UUID
|
mapId: UUID
|
||||||
map: Map
|
map: Map
|
||||||
@ -202,9 +191,7 @@ export type MapCharacter = {
|
|||||||
|
|
||||||
export type CharacterItem = {
|
export type CharacterItem = {
|
||||||
id: UUID
|
id: UUID
|
||||||
characterId: UUID
|
|
||||||
character: Character
|
character: Character
|
||||||
itemId: UUID
|
|
||||||
item: Item
|
item: Item
|
||||||
quantity: number
|
quantity: number
|
||||||
}
|
}
|
||||||
@ -212,7 +199,6 @@ export type CharacterItem = {
|
|||||||
export type CharacterEquipment = {
|
export type CharacterEquipment = {
|
||||||
id: UUID
|
id: UUID
|
||||||
slot: CharacterEquipmentSlotType
|
slot: CharacterEquipmentSlotType
|
||||||
characterItemId: UUID
|
|
||||||
characterItem: CharacterItem
|
characterItem: CharacterItem
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,9 +236,7 @@ export type SpriteAction = {
|
|||||||
|
|
||||||
export type Chat = {
|
export type Chat = {
|
||||||
id: UUID
|
id: UUID
|
||||||
characterId: UUID
|
|
||||||
character: Character
|
character: Character
|
||||||
mapId: UUID
|
|
||||||
map: Map
|
map: Map
|
||||||
message: string
|
message: string
|
||||||
createdAt: Date
|
createdAt: Date
|
||||||
|
@ -146,12 +146,12 @@ const setupSocketListeners = () => {
|
|||||||
updateScene()
|
updateScene()
|
||||||
})
|
})
|
||||||
|
|
||||||
gameStore.connection!.on('weather', (data: WeatherState) => {
|
gameStore.connection?.on('weather', (data: WeatherState) => {
|
||||||
weatherState.value = data
|
weatherState.value = data
|
||||||
updateScene()
|
updateScene()
|
||||||
})
|
})
|
||||||
|
|
||||||
gameStore.connection!.on('date', updateScene)
|
gameStore.connection?.on('date', updateScene)
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleResize = () => {
|
const handleResize = () => {
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import config from '@/application/config'
|
import config from '@/application/config'
|
||||||
import { type Sprite as SpriteT, type MapCharacter } from '@/application/types'
|
import { type MapCharacter, type Sprite as SpriteT } from '@/application/types'
|
||||||
import CharacterHair from '@/components/game/character/partials/CharacterHair.vue'
|
import CharacterHair from '@/components/game/character/partials/CharacterHair.vue'
|
||||||
import ChatBubble from '@/components/game/character/partials/ChatBubble.vue'
|
import ChatBubble from '@/components/game/character/partials/ChatBubble.vue'
|
||||||
import Healthbar from '@/components/game/character/partials/Healthbar.vue'
|
import Healthbar from '@/components/game/character/partials/Healthbar.vue'
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import type { Sprite as SpriteT, MapCharacter } from '@/application/types'
|
import type { MapCharacter, Sprite as SpriteT } from '@/application/types'
|
||||||
import { loadSpriteTextures } from '@/composables/gameComposable'
|
import { loadSpriteTextures } from '@/composables/gameComposable'
|
||||||
import { useGameStore } from '@/stores/gameStore'
|
import { useGameStore } from '@/stores/gameStore'
|
||||||
import { Image, useScene } from 'phavuer'
|
import { Image, useScene } from 'phavuer'
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import type { Sprite as SpriteT, MapCharacter } from '@/application/types'
|
import type { MapCharacter, Sprite as SpriteT } from '@/application/types'
|
||||||
import { loadSpriteTextures } from '@/composables/gameComposable'
|
import { loadSpriteTextures } from '@/composables/gameComposable'
|
||||||
import { useGameStore } from '@/stores/gameStore'
|
import { useGameStore } from '@/stores/gameStore'
|
||||||
import { Image, useScene } from 'phavuer'
|
import { Image, useScene } from 'phavuer'
|
||||||
|
@ -23,28 +23,28 @@ const tileMap = ref(null as Phaser.Tilemaps.Tilemap | null)
|
|||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
mapStore.reset()
|
mapStore.reset()
|
||||||
gameStore.connection!.off('map:character:teleport')
|
gameStore.connection?.off('map:character:teleport')
|
||||||
gameStore.connection!.off('map:character:join')
|
gameStore.connection?.off('map:character:join')
|
||||||
gameStore.connection!.off('map:character:leave')
|
gameStore.connection?.off('map:character:leave')
|
||||||
gameStore.connection!.off('map:character:move')
|
gameStore.connection?.off('map:character:move')
|
||||||
})
|
})
|
||||||
|
|
||||||
// Event listeners
|
// Event listeners
|
||||||
gameStore.connection!.on('map:character:teleport', async (data: mapLoadData) => {
|
gameStore.connection?.on('map:character:teleport', async (data: mapLoadData) => {
|
||||||
await loadMapTilesIntoScene(data.map.id, scene)
|
await loadMapTilesIntoScene(data.map.id, scene)
|
||||||
mapStore.setMap(data.map)
|
mapStore.setMap(data.map)
|
||||||
mapStore.setCharacters(data.characters)
|
mapStore.setCharacters(data.characters)
|
||||||
})
|
})
|
||||||
|
|
||||||
gameStore.connection!.on('map:character:join', async (data: MapCharacter) => {
|
gameStore.connection?.on('map:character:join', async (data: MapCharacter) => {
|
||||||
mapStore.addCharacter(data)
|
mapStore.addCharacter(data)
|
||||||
})
|
})
|
||||||
|
|
||||||
gameStore.connection!.on('map:character:leave', (characterId: number) => {
|
gameStore.connection?.on('map:character:leave', (characterId: number) => {
|
||||||
mapStore.removeCharacter(characterId)
|
mapStore.removeCharacter(characterId)
|
||||||
})
|
})
|
||||||
|
|
||||||
gameStore.connection!.on('map:character:move', (data: { characterId: number; positionX: number; positionY: number; rotation: number; isMoving: boolean }) => {
|
gameStore.connection?.on('map:character:move', (data: { characterId: number; positionX: number; positionY: number; rotation: number; isMoving: boolean }) => {
|
||||||
mapStore.updateCharacterPosition(data)
|
mapStore.updateCharacterPosition(data)
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
<a class="relative p-2.5 hover:cursor-pointer hover:bg-cyan rounded group" :class="{ 'bg-cyan': selectedCategory === 'tiles' }" @click="() => (selectedCategory = 'tiles')">
|
<a class="relative p-2.5 hover:cursor-pointer hover:bg-cyan rounded group" :class="{ 'bg-cyan': selectedCategory === 'tiles' }" @click="() => (selectedCategory = 'tiles')">
|
||||||
<span class="group-hover:text-white" :class="{ 'text-white': selectedCategory === 'tiles' }">Tiles</span>
|
<span class="group-hover:text-white" :class="{ 'text-white': selectedCategory === 'tiles' }">Tiles</span>
|
||||||
</a>
|
</a>
|
||||||
<a class="relative p-2.5 hover:cursor-pointer hover:bg-cyan rounded group" :class="{ 'bg-cyan': selectedCategory === 'objects' }" @click="() => (selectedCategory = 'objects')">
|
<a class="relative p-2.5 hover:cursor-pointer hover:bg-cyan rounded group" :class="{ 'bg-cyan': selectedCategory === 'map_objects' }" @click="() => (selectedCategory = 'map_objects')">
|
||||||
<span class="group-hover:text-white" :class="{ 'text-white': selectedCategory === 'objects' }">Objects</span>
|
<span class="group-hover:text-white" :class="{ 'text-white': selectedCategory === 'map_objects' }">Map objects</span>
|
||||||
</a>
|
</a>
|
||||||
<a class="relative p-2.5 hover:cursor-pointer hover:bg-cyan rounded group" :class="{ 'bg-cyan': selectedCategory === 'sprites' }" @click="() => (selectedCategory = 'sprites')">
|
<a class="relative p-2.5 hover:cursor-pointer hover:bg-cyan rounded group" :class="{ 'bg-cyan': selectedCategory === 'sprites' }" @click="() => (selectedCategory = 'sprites')">
|
||||||
<span class="group-hover:text-white" :class="{ 'text-white': selectedCategory === 'sprites' }">Sprites</span>
|
<span class="group-hover:text-white" :class="{ 'text-white': selectedCategory === 'sprites' }">Sprites</span>
|
||||||
@ -40,7 +40,7 @@
|
|||||||
<!-- Assets list -->
|
<!-- Assets list -->
|
||||||
<div class="overflow-auto h-full w-4/12 flex flex-col relative">
|
<div class="overflow-auto h-full w-4/12 flex flex-col relative">
|
||||||
<TileList v-if="selectedCategory === 'tiles'" />
|
<TileList v-if="selectedCategory === 'tiles'" />
|
||||||
<ObjectList v-if="selectedCategory === 'objects'" />
|
<MapObjectList v-if="selectedCategory === 'map_objects'" />
|
||||||
<SpriteList v-if="selectedCategory === 'sprites'" />
|
<SpriteList v-if="selectedCategory === 'sprites'" />
|
||||||
<ItemList v-if="selectedCategory === 'items'" />
|
<ItemList v-if="selectedCategory === 'items'" />
|
||||||
<CharacterTypeList v-if="selectedCategory === 'characterTypes'" />
|
<CharacterTypeList v-if="selectedCategory === 'characterTypes'" />
|
||||||
@ -50,7 +50,7 @@
|
|||||||
<!-- Asset details -->
|
<!-- Asset details -->
|
||||||
<div class="flex w-7/12 after:hidden flex-col relative overflow-auto">
|
<div class="flex w-7/12 after:hidden flex-col relative overflow-auto">
|
||||||
<TileDetails v-if="selectedCategory === 'tiles' && assetManagerStore.selectedTile" />
|
<TileDetails v-if="selectedCategory === 'tiles' && assetManagerStore.selectedTile" />
|
||||||
<ObjectDetails v-if="selectedCategory === 'objects' && assetManagerStore.selectedObject" />
|
<MapObjectDetails v-if="selectedCategory === 'map_objects' && assetManagerStore.selectedMapObject" />
|
||||||
<SpriteDetails v-if="selectedCategory === 'sprites' && assetManagerStore.selectedSprite" />
|
<SpriteDetails v-if="selectedCategory === 'sprites' && assetManagerStore.selectedSprite" />
|
||||||
<ItemDetails v-if="selectedCategory === 'items' && assetManagerStore.selectedItem" />
|
<ItemDetails v-if="selectedCategory === 'items' && assetManagerStore.selectedItem" />
|
||||||
<CharacterTypeDetails v-if="selectedCategory === 'characterTypes' && assetManagerStore.selectedCharacterType" />
|
<CharacterTypeDetails v-if="selectedCategory === 'characterTypes' && assetManagerStore.selectedCharacterType" />
|
||||||
@ -66,8 +66,8 @@ import CharacterTypeDetails from '@/components/gameMaster/assetManager/partials/
|
|||||||
import CharacterTypeList from '@/components/gameMaster/assetManager/partials/characterType/CharacterTypeList.vue'
|
import CharacterTypeList from '@/components/gameMaster/assetManager/partials/characterType/CharacterTypeList.vue'
|
||||||
import ItemDetails from '@/components/gameMaster/assetManager/partials/item/itemDetails.vue'
|
import ItemDetails from '@/components/gameMaster/assetManager/partials/item/itemDetails.vue'
|
||||||
import ItemList from '@/components/gameMaster/assetManager/partials/item/itemList.vue'
|
import ItemList from '@/components/gameMaster/assetManager/partials/item/itemList.vue'
|
||||||
import ObjectDetails from '@/components/gameMaster/assetManager/partials/object/ObjectDetails.vue'
|
import MapObjectDetails from '@/components/gameMaster/assetManager/partials/mapObject/MapObjectDetails.vue'
|
||||||
import ObjectList from '@/components/gameMaster/assetManager/partials/object/ObjectList.vue'
|
import MapObjectList from '@/components/gameMaster/assetManager/partials/mapObject/MapObjectList.vue'
|
||||||
import SpriteDetails from '@/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue'
|
import SpriteDetails from '@/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue'
|
||||||
import SpriteList from '@/components/gameMaster/assetManager/partials/sprite/SpriteList.vue'
|
import SpriteList from '@/components/gameMaster/assetManager/partials/sprite/SpriteList.vue'
|
||||||
import TileDetails from '@/components/gameMaster/assetManager/partials/tile/TileDetails.vue'
|
import TileDetails from '@/components/gameMaster/assetManager/partials/tile/TileDetails.vue'
|
||||||
|
@ -59,7 +59,7 @@ if (selectedCharacterHair.value) {
|
|||||||
characterName.value = selectedCharacterHair.value.name
|
characterName.value = selectedCharacterHair.value.name
|
||||||
characterGender.value = selectedCharacterHair.value.gender
|
characterGender.value = selectedCharacterHair.value.gender
|
||||||
characterIsSelectable.value = selectedCharacterHair.value.isSelectable
|
characterIsSelectable.value = selectedCharacterHair.value.isSelectable
|
||||||
characterSpriteId.value = selectedCharacterHair.value.spriteId
|
characterSpriteId.value = selectedCharacterHair.value.sprite?.id
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeCharacterHair() {
|
function removeCharacterHair() {
|
||||||
@ -107,7 +107,7 @@ watch(selectedCharacterHair, (characterHair: CharacterHair | null) => {
|
|||||||
characterName.value = characterHair.name
|
characterName.value = characterHair.name
|
||||||
characterGender.value = characterHair.gender
|
characterGender.value = characterHair.gender
|
||||||
characterIsSelectable.value = characterHair.isSelectable
|
characterIsSelectable.value = characterHair.isSelectable
|
||||||
characterSpriteId.value = characterHair.spriteId
|
characterSpriteId.value = characterHair.sprite?.id
|
||||||
})
|
})
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
@ -93,6 +93,7 @@ function toTop() {
|
|||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
gameStore.connection?.emit('gm:characterHair:list', {}, (response: CharacterHair[]) => {
|
gameStore.connection?.emit('gm:characterHair:list', {}, (response: CharacterHair[]) => {
|
||||||
|
console.log(response)
|
||||||
assetManagerStore.setCharacterHairList(response)
|
assetManagerStore.setCharacterHairList(response)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -68,7 +68,7 @@ if (selectedCharacterType.value) {
|
|||||||
characterGender.value = selectedCharacterType.value.gender
|
characterGender.value = selectedCharacterType.value.gender
|
||||||
characterRace.value = selectedCharacterType.value.race
|
characterRace.value = selectedCharacterType.value.race
|
||||||
characterIsSelectable.value = selectedCharacterType.value.isSelectable
|
characterIsSelectable.value = selectedCharacterType.value.isSelectable
|
||||||
characterSpriteId.value = selectedCharacterType.value.spriteId
|
characterSpriteId.value = selectedCharacterType.value.sprite?.id
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeCharacterType() {
|
function removeCharacterType() {
|
||||||
@ -118,7 +118,7 @@ watch(selectedCharacterType, (characterType: CharacterType | null) => {
|
|||||||
characterGender.value = characterType.gender
|
characterGender.value = characterType.gender
|
||||||
characterRace.value = characterType.race
|
characterRace.value = characterType.race
|
||||||
characterIsSelectable.value = characterType.isSelectable
|
characterIsSelectable.value = characterType.isSelectable
|
||||||
characterSpriteId.value = characterType.spriteId
|
characterSpriteId.value = characterType.sprite?.id
|
||||||
})
|
})
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
@ -93,6 +93,7 @@ function toTop() {
|
|||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
gameStore.connection?.emit('gm:characterType:list', {}, (response: CharacterType[]) => {
|
gameStore.connection?.emit('gm:characterType:list', {}, (response: CharacterType[]) => {
|
||||||
|
console.log(response)
|
||||||
assetManagerStore.setCharacterTypeList(response)
|
assetManagerStore.setCharacterTypeList(response)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { Item, ItemRarity, ItemType } from '@/application/types'
|
import type { Item, ItemRarity, ItemType, Sprite } from '@/application/types'
|
||||||
import { useAssetManagerStore } from '@/stores/assetManagerStore'
|
import { useAssetManagerStore } from '@/stores/assetManagerStore'
|
||||||
import { useGameStore } from '@/stores/gameStore'
|
import { useGameStore } from '@/stores/gameStore'
|
||||||
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
|
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
|
||||||
|
@ -0,0 +1,163 @@
|
|||||||
|
<template>
|
||||||
|
<div class="h-full overflow-auto">
|
||||||
|
<div class="relative p-2.5 flex flex-col items-center justify-center h-72 rounded-md default-border bg-gray">
|
||||||
|
<img class="max-h-56" :src="`${config.server_endpoint}/assets/map_objects/${selectedMapObject?.id}.png`" :alt="'Object ' + selectedMapObject?.id" />
|
||||||
|
</div>
|
||||||
|
<div class="mt-5 block">
|
||||||
|
<form class="flex gap-2.5 flex-wrap" @submit.prevent="saveObject">
|
||||||
|
<div class="form-field-full">
|
||||||
|
<label for="name">Name</label>
|
||||||
|
<input v-model="mapObjectName" class="input-field" type="text" name="name" placeholder="Wall #1" />
|
||||||
|
</div>
|
||||||
|
<div class="form-field-half">
|
||||||
|
<label for="origin-x">Origin X</label>
|
||||||
|
<input v-model="mapObjectOriginX" class="input-field" type="number" step="any" name="origin-x" placeholder="Origin X" />
|
||||||
|
</div>
|
||||||
|
<div class="form-field-half">
|
||||||
|
<label for="origin-y">Origin Y</label>
|
||||||
|
<input v-model="mapObjectOriginY" class="input-field" type="number" step="any" name="origin-y" placeholder="Origin Y" />
|
||||||
|
</div>
|
||||||
|
<div class="form-field-full">
|
||||||
|
<label for="tags">Tags</label>
|
||||||
|
<ChipsInput v-model="mapObjectTags" @update:modelValue="mapObjectTags = $event" />
|
||||||
|
</div>
|
||||||
|
<div class="form-field-full">
|
||||||
|
<label for="is-animated">Is animated</label>
|
||||||
|
<select v-model="mapObjectIsAnimated" class="input-field" name="is-animated">
|
||||||
|
<option :value="false">No</option>
|
||||||
|
<option :value="true">Yes</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-field-full">
|
||||||
|
<label for="frame-speed">Frame rate</label>
|
||||||
|
<input v-model="mapObjectFrameRate" class="input-field" type="number" step="any" name="frame-speed" placeholder="Frame rate" />
|
||||||
|
</div>
|
||||||
|
<div class="form-field-half">
|
||||||
|
<label for="frame-width">Frame width</label>
|
||||||
|
<input v-model="mapObjectFrameWidth" class="input-field" type="number" step="any" name="frame-width" placeholder="Frame width" />
|
||||||
|
</div>
|
||||||
|
<div class="form-field-half">
|
||||||
|
<label for="frame-height">Frame height</label>
|
||||||
|
<input v-model="mapObjectFrameHeight" class="input-field" type="number" step="any" name="frame-height" placeholder="Frame height" />
|
||||||
|
</div>
|
||||||
|
<div class="flex gap-4">
|
||||||
|
<button class="btn-cyan px-4 py-1.5 min-w-24" type="submit">Save</button>
|
||||||
|
<button class="btn-red px-4 py-1.5 min-w-24" type="button" @click.prevent="removeObject">Delete</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import config from '@/application/config'
|
||||||
|
import type { MapObject } from '@/application/types'
|
||||||
|
import ChipsInput from '@/components/forms/ChipsInput.vue'
|
||||||
|
import { useAssetManagerStore } from '@/stores/assetManagerStore'
|
||||||
|
import { useGameStore } from '@/stores/gameStore'
|
||||||
|
import { useMapEditorStore } from '@/stores/mapEditorStore'
|
||||||
|
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
|
||||||
|
|
||||||
|
const gameStore = useGameStore()
|
||||||
|
const assetManagerStore = useAssetManagerStore()
|
||||||
|
const mapEditorStore = useMapEditorStore()
|
||||||
|
|
||||||
|
const selectedMapObject = computed(() => assetManagerStore.selectedMapObject)
|
||||||
|
|
||||||
|
const mapObjectName = ref('')
|
||||||
|
const mapObjectTags = ref<string[]>([])
|
||||||
|
const mapObjectOriginX = ref(0)
|
||||||
|
const mapObjectOriginY = ref(0)
|
||||||
|
const mapObjectIsAnimated = ref(false)
|
||||||
|
const mapObjectFrameRate = ref(0)
|
||||||
|
const mapObjectFrameWidth = ref(0)
|
||||||
|
const mapObjectFrameHeight = ref(0)
|
||||||
|
|
||||||
|
if (!selectedMapObject.value) {
|
||||||
|
console.error('No map mapObject selected')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedMapObject.value) {
|
||||||
|
mapObjectName.value = selectedMapObject.value.name
|
||||||
|
mapObjectTags.value = selectedMapObject.value.tags
|
||||||
|
mapObjectOriginX.value = selectedMapObject.value.originX
|
||||||
|
mapObjectOriginY.value = selectedMapObject.value.originY
|
||||||
|
mapObjectIsAnimated.value = selectedMapObject.value.isAnimated
|
||||||
|
mapObjectFrameRate.value = selectedMapObject.value.frameRate
|
||||||
|
mapObjectFrameWidth.value = selectedMapObject.value.frameWidth
|
||||||
|
mapObjectFrameHeight.value = selectedMapObject.value.frameHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeObject() {
|
||||||
|
gameStore.connection?.emit('gm:mapObject:remove', { mapObject: selectedMapObject.value?.id }, (response: boolean) => {
|
||||||
|
if (!response) {
|
||||||
|
console.error('Failed to remove mapObject')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
refreshObjectList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshObjectList(unsetSelectedObject = true) {
|
||||||
|
gameStore.connection?.emit('gm:mapObject:list', {}, (response: MapObject[]) => {
|
||||||
|
assetManagerStore.setMapObjectList(response)
|
||||||
|
|
||||||
|
if (unsetSelectedObject) {
|
||||||
|
assetManagerStore.setSelectedMapObject(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mapEditorStore.active) {
|
||||||
|
mapEditorStore.setMapObjectList(response)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveObject() {
|
||||||
|
if (!selectedMapObject.value) {
|
||||||
|
console.error('No mapObject selected')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
gameStore.connection?.emit(
|
||||||
|
'gm:mapObject:update',
|
||||||
|
{
|
||||||
|
id: selectedMapObject.value.id,
|
||||||
|
name: mapObjectName.value,
|
||||||
|
tags: mapObjectTags.value,
|
||||||
|
originX: mapObjectOriginX.value,
|
||||||
|
originY: mapObjectOriginY.value,
|
||||||
|
isAnimated: mapObjectIsAnimated.value,
|
||||||
|
frameRate: mapObjectFrameRate.value,
|
||||||
|
frameWidth: mapObjectFrameWidth.value,
|
||||||
|
frameHeight: mapObjectFrameHeight.value
|
||||||
|
},
|
||||||
|
(response: boolean) => {
|
||||||
|
if (!response) {
|
||||||
|
console.error('Failed to save mapObject')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
refreshObjectList(false)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(selectedMapObject, (mapObject: MapObject | null) => {
|
||||||
|
if (!mapObject) return
|
||||||
|
mapObjectName.value = mapObject.name
|
||||||
|
mapObjectTags.value = mapObject.tags
|
||||||
|
mapObjectOriginX.value = mapObject.originX
|
||||||
|
mapObjectOriginY.value = mapObject.originY
|
||||||
|
mapObjectIsAnimated.value = mapObject.isAnimated
|
||||||
|
mapObjectFrameRate.value = mapObject.frameRate
|
||||||
|
mapObjectFrameWidth.value = mapObject.frameWidth
|
||||||
|
mapObjectFrameHeight.value = mapObject.frameHeight
|
||||||
|
})
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
if (!selectedMapObject.value) return
|
||||||
|
})
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
assetManagerStore.setSelectedMapObject(null)
|
||||||
|
})
|
||||||
|
</script>
|
@ -10,12 +10,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-bind="containerProps" class="overflow-y-auto relative p-2.5 rounded-md default-border bg-gray" @scroll="onScroll">
|
<div v-bind="containerProps" class="overflow-y-auto relative p-2.5 rounded-md default-border bg-gray" @scroll="onScroll">
|
||||||
<div v-bind="wrapperProps" ref="elementToScroll">
|
<div v-bind="wrapperProps" ref="elementToScroll">
|
||||||
<a v-for="{ data: object } in list" :key="object.id" class="relative p-2.5 cursor-pointer block rounded hover:bg-cyan group" :class="{ 'bg-cyan': assetManagerStore.selectedObject?.id === object.id }" @click="assetManagerStore.setSelectedObject(object as Object)">
|
<a v-for="{ data: mapObject } in list" :key="mapObject.id" class="relative p-2.5 cursor-pointer block rounded hover:bg-cyan group" :class="{ 'bg-cyan': assetManagerStore.selectedMapObject?.id === mapObject.id }" @click="assetManagerStore.setSelectedMapObject(mapObject as MapObject)">
|
||||||
<div class="flex items-center gap-2.5">
|
<div class="flex items-center gap-2.5">
|
||||||
<div class="h-7 w-16 max-w-16 flex justify-center">
|
<div class="h-7 w-16 max-w-16 flex justify-center">
|
||||||
<img class="h-7" :src="`${config.server_endpoint}/assets/objects/${object.id}.png`" alt="Object" />
|
<img class="h-7" :src="`${config.server_endpoint}/assets/map_objects/${mapObject.id}.png`" alt="Object" />
|
||||||
</div>
|
</div>
|
||||||
<span :class="{ 'text-white': assetManagerStore.selectedObject?.id === object.id }">{{ object.name }}</span>
|
<span :class="{ 'text-white': assetManagerStore.selectedMapObject?.id === mapObject.id }">{{ mapObject.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import config from '@/application/config'
|
import config from '@/application/config'
|
||||||
import type { Object } from '@/application/types'
|
import type { MapObject } from '@/application/types'
|
||||||
import { useAssetManagerStore } from '@/stores/assetManagerStore'
|
import { useAssetManagerStore } from '@/stores/assetManagerStore'
|
||||||
import { useGameStore } from '@/stores/gameStore'
|
import { useGameStore } from '@/stores/gameStore'
|
||||||
import { useVirtualList } from '@vueuse/core'
|
import { useVirtualList } from '@vueuse/core'
|
||||||
@ -47,14 +47,15 @@ const elementToScroll = ref()
|
|||||||
const handleFileUpload = (e: Event) => {
|
const handleFileUpload = (e: Event) => {
|
||||||
const files = (e.target as HTMLInputElement).files
|
const files = (e.target as HTMLInputElement).files
|
||||||
if (!files) return
|
if (!files) return
|
||||||
gameStore.connection?.emit('gm:object:upload', files, (response: boolean) => {
|
gameStore.connection?.emit('gm:mapObject:upload', files, (response: boolean) => {
|
||||||
|
console.log(response)
|
||||||
if (!response) {
|
if (!response) {
|
||||||
if (config.development) console.error('Failed to upload object')
|
if (config.development) console.error('Failed to upload object')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
gameStore.connection?.emit('gm:object:list', {}, (response: Object[]) => {
|
gameStore.connection?.emit('gm:mapObject:list', {}, (response: MapObject[]) => {
|
||||||
assetManagerStore.setObjectList(response)
|
assetManagerStore.setMapObjectList(response)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -66,9 +67,9 @@ const handleSearch = () => {
|
|||||||
|
|
||||||
const filteredObjects = computed(() => {
|
const filteredObjects = computed(() => {
|
||||||
if (!searchQuery.value) {
|
if (!searchQuery.value) {
|
||||||
return assetManagerStore.objectList
|
return assetManagerStore.mapObjectList
|
||||||
}
|
}
|
||||||
return assetManagerStore.objectList.filter((object) => object.name.toLowerCase().includes(searchQuery.value.toLowerCase()))
|
return assetManagerStore.mapObjectList.filter((object) => object.name.toLowerCase().includes(searchQuery.value.toLowerCase()))
|
||||||
})
|
})
|
||||||
|
|
||||||
const { list, containerProps, wrapperProps, scrollTo } = useVirtualList(filteredObjects, {
|
const { list, containerProps, wrapperProps, scrollTo } = useVirtualList(filteredObjects, {
|
||||||
@ -92,8 +93,9 @@ function toTop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
gameStore.connection?.emit('gm:object:list', {}, (response: Object[]) => {
|
gameStore.connection?.emit('gm:mapObject:list', {}, (response: MapObject[]) => {
|
||||||
assetManagerStore.setObjectList(response)
|
console.log(response)
|
||||||
|
assetManagerStore.setMapObjectList(response)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
@ -1,163 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="h-full overflow-auto">
|
|
||||||
<div class="relative p-2.5 flex flex-col items-center justify-center h-72 rounded-md default-border bg-gray">
|
|
||||||
<img class="max-h-56" :src="`${config.server_endpoint}/assets/objects/${selectedObject?.id}.png`" :alt="'Object ' + selectedObject?.id" />
|
|
||||||
</div>
|
|
||||||
<div class="mt-5 block">
|
|
||||||
<form class="flex gap-2.5 flex-wrap" @submit.prevent="saveObject">
|
|
||||||
<div class="form-field-full">
|
|
||||||
<label for="name">Name</label>
|
|
||||||
<input v-model="objectName" class="input-field" type="text" name="name" placeholder="Wall #1" />
|
|
||||||
</div>
|
|
||||||
<div class="form-field-half">
|
|
||||||
<label for="origin-x">Origin X</label>
|
|
||||||
<input v-model="objectOriginX" class="input-field" type="number" step="any" name="origin-x" placeholder="Origin X" />
|
|
||||||
</div>
|
|
||||||
<div class="form-field-half">
|
|
||||||
<label for="origin-y">Origin Y</label>
|
|
||||||
<input v-model="objectOriginY" class="input-field" type="number" step="any" name="origin-y" placeholder="Origin Y" />
|
|
||||||
</div>
|
|
||||||
<div class="form-field-full">
|
|
||||||
<label for="tags">Tags</label>
|
|
||||||
<ChipsInput v-model="objectTags" @update:modelValue="objectTags = $event" />
|
|
||||||
</div>
|
|
||||||
<div class="form-field-full">
|
|
||||||
<label for="is-animated">Is animated</label>
|
|
||||||
<select v-model="objectIsAnimated" class="input-field" name="is-animated">
|
|
||||||
<option :value="false">No</option>
|
|
||||||
<option :value="true">Yes</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="form-field-full">
|
|
||||||
<label for="frame-speed">Frame rate</label>
|
|
||||||
<input v-model="objectFrameRate" class="input-field" type="number" step="any" name="frame-speed" placeholder="Frame rate" />
|
|
||||||
</div>
|
|
||||||
<div class="form-field-half">
|
|
||||||
<label for="frame-width">Frame width</label>
|
|
||||||
<input v-model="objectFrameWidth" class="input-field" type="number" step="any" name="frame-width" placeholder="Frame width" />
|
|
||||||
</div>
|
|
||||||
<div class="form-field-half">
|
|
||||||
<label for="frame-height">Frame height</label>
|
|
||||||
<input v-model="objectFrameHeight" class="input-field" type="number" step="any" name="frame-height" placeholder="Frame height" />
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-4">
|
|
||||||
<button class="btn-cyan px-4 py-1.5 min-w-24" type="submit">Save</button>
|
|
||||||
<button class="btn-red px-4 py-1.5 min-w-24" type="button" @click.prevent="removeObject">Delete</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import config from '@/application/config'
|
|
||||||
import type { Object } from '@/application/types'
|
|
||||||
import ChipsInput from '@/components/forms/ChipsInput.vue'
|
|
||||||
import { useAssetManagerStore } from '@/stores/assetManagerStore'
|
|
||||||
import { useGameStore } from '@/stores/gameStore'
|
|
||||||
import { useMapEditorStore } from '@/stores/mapEditorStore'
|
|
||||||
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
|
|
||||||
|
|
||||||
const gameStore = useGameStore()
|
|
||||||
const assetManagerStore = useAssetManagerStore()
|
|
||||||
const mapEditorStore = useMapEditorStore()
|
|
||||||
|
|
||||||
const selectedObject = computed(() => assetManagerStore.selectedObject)
|
|
||||||
|
|
||||||
const objectName = ref('')
|
|
||||||
const objectTags = ref<string[]>([])
|
|
||||||
const objectOriginX = ref(0)
|
|
||||||
const objectOriginY = ref(0)
|
|
||||||
const objectIsAnimated = ref(false)
|
|
||||||
const objectFrameRate = ref(0)
|
|
||||||
const objectFrameWidth = ref(0)
|
|
||||||
const objectFrameHeight = ref(0)
|
|
||||||
|
|
||||||
if (!selectedObject.value) {
|
|
||||||
console.error('No object selected')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (selectedObject.value) {
|
|
||||||
objectName.value = selectedObject.value.name
|
|
||||||
objectTags.value = selectedObject.value.tags
|
|
||||||
objectOriginX.value = selectedObject.value.originX
|
|
||||||
objectOriginY.value = selectedObject.value.originY
|
|
||||||
objectIsAnimated.value = selectedObject.value.isAnimated
|
|
||||||
objectFrameRate.value = selectedObject.value.frameRate
|
|
||||||
objectFrameWidth.value = selectedObject.value.frameWidth
|
|
||||||
objectFrameHeight.value = selectedObject.value.frameHeight
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeObject() {
|
|
||||||
gameStore.connection?.emit('gm:object:remove', { object: selectedObject.value?.id }, (response: boolean) => {
|
|
||||||
if (!response) {
|
|
||||||
console.error('Failed to remove object')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
refreshObjectList()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function refreshObjectList(unsetSelectedObject = true) {
|
|
||||||
gameStore.connection?.emit('gm:object:list', {}, (response: Object[]) => {
|
|
||||||
assetManagerStore.setObjectList(response)
|
|
||||||
|
|
||||||
if (unsetSelectedObject) {
|
|
||||||
assetManagerStore.setSelectedObject(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mapEditorStore.active) {
|
|
||||||
mapEditorStore.setObjectList(response)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveObject() {
|
|
||||||
if (!selectedObject.value) {
|
|
||||||
console.error('No object selected')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
gameStore.connection?.emit(
|
|
||||||
'gm:object:update',
|
|
||||||
{
|
|
||||||
id: selectedObject.value.id,
|
|
||||||
name: objectName.value,
|
|
||||||
tags: objectTags.value,
|
|
||||||
originX: objectOriginX.value,
|
|
||||||
originY: objectOriginY.value,
|
|
||||||
isAnimated: objectIsAnimated.value,
|
|
||||||
frameRate: objectFrameRate.value,
|
|
||||||
frameWidth: objectFrameWidth.value,
|
|
||||||
frameHeight: objectFrameHeight.value
|
|
||||||
},
|
|
||||||
(response: boolean) => {
|
|
||||||
if (!response) {
|
|
||||||
console.error('Failed to save object')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
refreshObjectList(false)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
watch(selectedObject, (object: Object | null) => {
|
|
||||||
if (!object) return
|
|
||||||
objectName.value = object.name
|
|
||||||
objectTags.value = object.tags
|
|
||||||
objectOriginX.value = object.originX
|
|
||||||
objectOriginY.value = object.originY
|
|
||||||
objectIsAnimated.value = object.isAnimated
|
|
||||||
objectFrameRate.value = object.frameRate
|
|
||||||
objectFrameWidth.value = object.frameWidth
|
|
||||||
objectFrameHeight.value = object.frameHeight
|
|
||||||
})
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
if (!selectedObject.value) return
|
|
||||||
})
|
|
||||||
|
|
||||||
onBeforeUnmount(() => {
|
|
||||||
assetManagerStore.setSelectedObject(null)
|
|
||||||
})
|
|
||||||
</script>
|
|
@ -184,6 +184,7 @@ function addNewImage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sortSpriteActions(actions: SpriteAction[]): SpriteAction[] {
|
function sortSpriteActions(actions: SpriteAction[]): SpriteAction[] {
|
||||||
|
if (!actions) return []
|
||||||
return [...actions].sort((a, b) => a.action.localeCompare(b.action))
|
return [...actions].sort((a, b) => a.action.localeCompare(b.action))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,16 +15,16 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { type Map } from '@/application/types'
|
import { type Map } from '@/application/types'
|
||||||
|
import MapEventTiles from '@/components/gameMaster/mapEditor/mapPartials/MapEventTiles.vue'
|
||||||
|
import MapObjects from '@/components/gameMaster/mapEditor/mapPartials/MapObjects.vue'
|
||||||
|
import MapTiles from '@/components/gameMaster/mapEditor/mapPartials/MapTiles.vue'
|
||||||
|
import MapList from '@/components/gameMaster/mapEditor/partials/MapList.vue'
|
||||||
|
import MapSettings from '@/components/gameMaster/mapEditor/partials/MapSettings.vue'
|
||||||
import ObjectList from '@/components/gameMaster/mapEditor/partials/ObjectList.vue'
|
import ObjectList from '@/components/gameMaster/mapEditor/partials/ObjectList.vue'
|
||||||
import TeleportModal from '@/components/gameMaster/mapEditor/partials/TeleportModal.vue'
|
import TeleportModal from '@/components/gameMaster/mapEditor/partials/TeleportModal.vue'
|
||||||
import TileList from '@/components/gameMaster/mapEditor/partials/TileList.vue'
|
import TileList from '@/components/gameMaster/mapEditor/partials/TileList.vue'
|
||||||
// Components
|
// Components
|
||||||
import Toolbar from '@/components/gameMaster/mapEditor/partials/Toolbar.vue'
|
import Toolbar from '@/components/gameMaster/mapEditor/partials/Toolbar.vue'
|
||||||
import MapList from '@/components/gameMaster/mapEditor/partials/MapList.vue'
|
|
||||||
import MapSettings from '@/components/gameMaster/mapEditor/partials/MapSettings.vue'
|
|
||||||
import MapEventTiles from '@/components/gameMaster/mapEditor/mapPartials/MapEventTiles.vue'
|
|
||||||
import MapObjects from '@/components/gameMaster/mapEditor/mapPartials/MapObjects.vue'
|
|
||||||
import MapTiles from '@/components/gameMaster/mapEditor/mapPartials/MapTiles.vue'
|
|
||||||
import { useGameStore } from '@/stores/gameStore'
|
import { useGameStore } from '@/stores/gameStore'
|
||||||
import { useMapEditorStore } from '@/stores/mapEditorStore'
|
import { useMapEditorStore } from '@/stores/mapEditorStore'
|
||||||
import { onUnmounted, ref } from 'vue'
|
import { onUnmounted, ref } from 'vue'
|
||||||
@ -38,7 +38,7 @@ function clear() {
|
|||||||
if (!mapEditorStore.map) return
|
if (!mapEditorStore.map) return
|
||||||
|
|
||||||
// Clear objects, event tiles and tiles
|
// Clear objects, event tiles and tiles
|
||||||
mapEditorStore.map.mapObjects = []
|
mapEditorStore.map.placedMapObjects = []
|
||||||
mapEditorStore.map.mapEventTiles = []
|
mapEditorStore.map.mapEventTiles = []
|
||||||
mapEditorStore.triggerClearTiles()
|
mapEditorStore.triggerClearTiles()
|
||||||
}
|
}
|
||||||
@ -55,14 +55,14 @@ function save() {
|
|||||||
pvp: mapEditorStore.map.pvp,
|
pvp: mapEditorStore.map.pvp,
|
||||||
mapEffects: mapEditorStore.map.mapEffects.map(({ id, mapId, effect, strength }) => ({ id, mapId, effect, strength })),
|
mapEffects: mapEditorStore.map.mapEffects.map(({ id, mapId, effect, strength }) => ({ id, mapId, effect, strength })),
|
||||||
mapEventTiles: mapEditorStore.map.mapEventTiles.map(({ id, mapId, type, positionX, positionY, teleport }) => ({ id, mapId, type, positionX, positionY, teleport })),
|
mapEventTiles: mapEditorStore.map.mapEventTiles.map(({ id, mapId, type, positionX, positionY, teleport }) => ({ id, mapId, type, positionX, positionY, teleport })),
|
||||||
mapObjects: mapEditorStore.map.mapObjects.map(({ id, mapId, objectId, depth, isRotated, positionX, positionY }) => ({ id, mapId, objectId, depth, isRotated, positionX, positionY }))
|
placedMapObjects: mapEditorStore.map.placedMapObjects.map(({ id, mapId, objectId, depth, isRotated, positionX, positionY }) => ({ id, mapId, objectId, depth, isRotated, positionX, positionY }))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mapEditorStore.isSettingsModalShown) {
|
if (mapEditorStore.isSettingsModalShown) {
|
||||||
mapEditorStore.toggleSettingsModal()
|
mapEditorStore.toggleSettingsModal()
|
||||||
}
|
}
|
||||||
|
|
||||||
gameStore.connection?.emit('gm:map_editor:map:update', data, (response: Map) => {
|
gameStore.connection?.emit('gm:map:update', data, (response: Map) => {
|
||||||
mapEditorStore.setMap(response)
|
mapEditorStore.setMap(response)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { PlacedMapObject as MapObjectT } from '@/application/types'
|
import type { PlacedMapObject as MapObjectT } from '@/application/types'
|
||||||
import { uuidv4 } from '@/application/utilities'
|
import { uuidv4 } from '@/application/utilities'
|
||||||
import SelectedMapObject from '@/components/gameMaster/mapEditor/partials/SelectedMapObject.vue'
|
|
||||||
import MapObject from '@/components/gameMaster/mapEditor/mapPartials/MapObject.vue'
|
import MapObject from '@/components/gameMaster/mapEditor/mapPartials/MapObject.vue'
|
||||||
|
import SelectedMapObject from '@/components/gameMaster/mapEditor/partials/SelectedMapObject.vue'
|
||||||
import { getTile } from '@/composables/mapComposable'
|
import { getTile } from '@/composables/mapComposable'
|
||||||
import { useMapEditorStore } from '@/stores/mapEditorStore'
|
import { useMapEditorStore } from '@/stores/mapEditorStore'
|
||||||
import { useScene } from 'phavuer'
|
import { useScene } from 'phavuer'
|
||||||
@ -65,7 +65,7 @@ function pencil(pointer: Phaser.Input.Pointer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add new object to mapObjects
|
// Add new object to mapObjects
|
||||||
mapEditorStore.map.mapObjects = mapEditorStore.map.mapObjects.concat(newObject as MapObjectT)
|
mapEditorStore.map.placedMapObjects = mapEditorStore.map.placedMapObjects.concat(newObject as MapObjectT)
|
||||||
}
|
}
|
||||||
|
|
||||||
function eraser(pointer: Phaser.Input.Pointer) {
|
function eraser(pointer: Phaser.Input.Pointer) {
|
||||||
@ -92,11 +92,11 @@ function eraser(pointer: Phaser.Input.Pointer) {
|
|||||||
if (!tile) return
|
if (!tile) return
|
||||||
|
|
||||||
// Check if object already exists on position
|
// Check if object already exists on position
|
||||||
const existingObject = mapEditorStore.map.mapObjects.find((object) => object.positionX === tile.x && object.positionY === tile.y)
|
const existingObject = mapEditorStore.map.placedMapObjects.find((object) => object.positionX === tile.x && object.positionY === tile.y)
|
||||||
if (!existingObject) return
|
if (!existingObject) return
|
||||||
|
|
||||||
// Remove existing object
|
// Remove existing object
|
||||||
mapEditorStore.map.mapObjects = mapEditorStore.map.mapObjects.filter((object) => object.id !== existingObject.id)
|
mapEditorStore.map.placedMapObjects = mapEditorStore.map.placedMapObjects.filter((object) => object.id !== existingObject.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
function objectPicker(pointer: Phaser.Input.Pointer) {
|
function objectPicker(pointer: Phaser.Input.Pointer) {
|
||||||
@ -123,7 +123,7 @@ function objectPicker(pointer: Phaser.Input.Pointer) {
|
|||||||
if (!tile) return
|
if (!tile) return
|
||||||
|
|
||||||
// Check if object already exists on position
|
// Check if object already exists on position
|
||||||
const existingObject = mapEditorStore.map.mapObjects.find((object) => object.positionX === tile.x && object.positionY === tile.y)
|
const existingObject = mapEditorStore.map.placedMapObjects.find((object) => object.positionX === tile.x && object.positionY === tile.y)
|
||||||
if (!existingObject) return
|
if (!existingObject) return
|
||||||
|
|
||||||
// Select the object
|
// Select the object
|
||||||
@ -134,7 +134,7 @@ function moveMapObject(id: string) {
|
|||||||
// Check if map is set
|
// Check if map is set
|
||||||
if (!mapEditorStore.map) return
|
if (!mapEditorStore.map) return
|
||||||
|
|
||||||
movingMapObject.value = mapEditorStore.map.mapObjects.find((object) => object.id === id) as MapObjectT
|
movingMapObject.value = mapEditorStore.map.placedMapObjects.find((object) => object.id === id) as MapObjectT
|
||||||
|
|
||||||
function handlePointerMove(pointer: Phaser.Input.Pointer) {
|
function handlePointerMove(pointer: Phaser.Input.Pointer) {
|
||||||
if (!movingMapObject.value) return
|
if (!movingMapObject.value) return
|
||||||
@ -160,7 +160,7 @@ function rotateMapObject(id: string) {
|
|||||||
// Check if map is set
|
// Check if map is set
|
||||||
if (!mapEditorStore.map) return
|
if (!mapEditorStore.map) return
|
||||||
|
|
||||||
mapEditorStore.map.mapObjects = mapEditorStore.map.mapObjects.map((object) => {
|
mapEditorStore.map.placedMapObjects = mapEditorStore.map.placedMapObjects.map((object) => {
|
||||||
if (object.id === id) {
|
if (object.id === id) {
|
||||||
return {
|
return {
|
||||||
...object,
|
...object,
|
||||||
@ -175,7 +175,7 @@ function deleteMapObject(id: string) {
|
|||||||
// Check if map is set
|
// Check if map is set
|
||||||
if (!mapEditorStore.map) return
|
if (!mapEditorStore.map) return
|
||||||
|
|
||||||
mapEditorStore.map.mapObjects = mapEditorStore.map.mapObjects.filter((object) => object.id !== id)
|
mapEditorStore.map.placedMapObjects = mapEditorStore.map.placedMapObjects.filter((object) => object.id !== id)
|
||||||
selectedMapObject.value = null
|
selectedMapObject.value = null
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +210,8 @@ watch(
|
|||||||
(newObjects) => {
|
(newObjects) => {
|
||||||
if (!mapEditorStore.map) return
|
if (!mapEditorStore.map) return
|
||||||
|
|
||||||
const updatedMapObjects = mapEditorStore.map.mapObjects.map((mapObject) => {
|
console.log(mapEditorStore.map.placedMapObjects)
|
||||||
|
const updatedMapObjects = mapEditorStore.map.placedMapObjects.map((mapObject) => {
|
||||||
const updatedObject = newObjects.find((obj) => obj.id === mapObject.object.id)
|
const updatedObject = newObjects.find((obj) => obj.id === mapObject.object.id)
|
||||||
if (updatedObject) {
|
if (updatedObject) {
|
||||||
return {
|
return {
|
||||||
|
@ -50,7 +50,7 @@ const width = ref(0)
|
|||||||
const height = ref(0)
|
const height = ref(0)
|
||||||
|
|
||||||
function submit() {
|
function submit() {
|
||||||
gameStore.connection.emit('gm:map_editor:map:create', { name: name.value, width: width.value, height: height.value }, (response: Map[]) => {
|
gameStore.connection.emit('gm:mapObject:create', { name: name.value, width: width.value, height: height.value }, (response: Map[]) => {
|
||||||
mapEditorStore.setMapList(response)
|
mapEditorStore.setMapList(response)
|
||||||
})
|
})
|
||||||
mapEditorStore.toggleCreateMapModal()
|
mapEditorStore.toggleCreateMapModal()
|
||||||
|
@ -41,20 +41,20 @@ onMounted(async () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
function fetchMaps() {
|
function fetchMaps() {
|
||||||
gameStore.connection?.emit('gm:map_editor:map:list', {}, (response: Map[]) => {
|
gameStore.connection?.emit('gm:mapObject:list', {}, (response: Map[]) => {
|
||||||
mapEditorStore.setMapList(response)
|
mapEditorStore.setMapList(response)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadMap(id: number) {
|
function loadMap(id: number) {
|
||||||
gameStore.connection?.emit('gm:map_editor:map:request', { mapId: id }, (response: Map) => {
|
gameStore.connection?.emit('gm:mapObject:request', { mapId: id }, (response: Map) => {
|
||||||
mapEditorStore.setMap(response)
|
mapEditorStore.setMap(response)
|
||||||
})
|
})
|
||||||
mapEditorStore.toggleMapListModal()
|
mapEditorStore.toggleMapListModal()
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteMap(id: number) {
|
function deleteMap(id: number) {
|
||||||
gameStore.connection?.emit('gm:map_editor:map:delete', { mapId: id }, () => {
|
gameStore.connection?.emit('gm:mapObject:delete', { mapId: id }, () => {
|
||||||
fetchMaps()
|
fetchMaps()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import config from '@/application/config'
|
import config from '@/application/config'
|
||||||
import type { Object, PlacedMapObject } from '@/application/types'
|
import type { MapObject, PlacedMapObject } from '@/application/types'
|
||||||
import Modal from '@/components/utilities/Modal.vue'
|
import Modal from '@/components/utilities/Modal.vue'
|
||||||
import { useGameStore } from '@/stores/gameStore'
|
import { useGameStore } from '@/stores/gameStore'
|
||||||
import { useMapEditorStore } from '@/stores/mapEditorStore'
|
import { useMapEditorStore } from '@/stores/mapEditorStore'
|
||||||
@ -77,8 +77,8 @@ const toggleTag = (tag: string) => {
|
|||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
isModalOpen.value = true
|
isModalOpen.value = true
|
||||||
gameStore.connection?.emit('gm:object:list', {}, (response: Object[]) => {
|
gameStore.connection?.emit('gm:mapObject:list', {}, (response: MapObject[]) => {
|
||||||
mapEditorStore.setObjectList(response)
|
mapEditorStore.setMapObjectList(response)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@ -52,7 +52,7 @@ const gameStore = useGameStore()
|
|||||||
onMounted(fetchMaps)
|
onMounted(fetchMaps)
|
||||||
|
|
||||||
function fetchMaps() {
|
function fetchMaps() {
|
||||||
gameStore.connection?.emit('gm:map_editor:map:list', {}, (response: Map[]) => {
|
gameStore.connection?.emit('gm:mapObject:list', {}, (response: Map[]) => {
|
||||||
mapEditorStore.setMapList(response)
|
mapEditorStore.setMapList(response)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ const scrollToBottom = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
gameStore.connection!.on('chat:message', (data: Chat) => {
|
gameStore.connection?.on('chat:message', (data: Chat) => {
|
||||||
chats.value.push(data)
|
chats.value.push(data)
|
||||||
scrollToBottom()
|
scrollToBottom()
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ import { onUnmounted } from 'vue'
|
|||||||
const gameStore = useGameStore()
|
const gameStore = useGameStore()
|
||||||
|
|
||||||
// Listen for new date from socket
|
// Listen for new date from socket
|
||||||
gameStore.connection!.on('date', (data: Date) => {
|
gameStore.connection?.on('date', (data: Date) => {
|
||||||
gameStore.world.date = new Date(data)
|
gameStore.world.date = new Date(data)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ setTimeout(() => {
|
|||||||
gameStore.connection?.emit('character:list')
|
gameStore.connection?.emit('character:list')
|
||||||
}, 750)
|
}, 750)
|
||||||
|
|
||||||
gameStore.connection!.on('character:list', (data: any) => {
|
gameStore.connection?.on('character:list', (data: any) => {
|
||||||
characters.value = data
|
characters.value = data
|
||||||
isLoading.value = false
|
isLoading.value = false
|
||||||
|
|
||||||
@ -174,7 +174,7 @@ function loginWithCharacter() {
|
|||||||
|
|
||||||
// Create character logics
|
// Create character logics
|
||||||
function createCharacter() {
|
function createCharacter() {
|
||||||
gameStore.connection!.on('character:create:success', (data: CharacterT) => {
|
gameStore.connection?.on('character:create:success', (data: CharacterT) => {
|
||||||
gameStore.setCharacter(data)
|
gameStore.setCharacter(data)
|
||||||
isCreateNewCharacterModalOpen.value = false
|
isCreateNewCharacterModalOpen.value = false
|
||||||
})
|
})
|
||||||
|
@ -72,8 +72,9 @@ const preloadScene = async (scene: Phaser.Scene) => {
|
|||||||
* Then load them into the scene.
|
* Then load them into the scene.
|
||||||
*/
|
*/
|
||||||
scene.load.rexAwait(async function (successCallback: any) {
|
scene.load.rexAwait(async function (successCallback: any) {
|
||||||
const tiles: AssetDataT[] = await fetch(config.server_endpoint + '/assets/list_tiles').then((response) => response.json())
|
const tiles: { data: AssetDataT[] } = await fetch(config.server_endpoint + '/assets/list_tiles').then((response) => response.json())
|
||||||
for await (const tile of tiles) {
|
|
||||||
|
for await (const tile of tiles?.data ?? []) {
|
||||||
await loadTexture(scene, tile)
|
await loadTexture(scene, tile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import type { CharacterHair, CharacterType, Item, Object, Sprite, Tile } from '@/application/types'
|
import type { CharacterHair, CharacterType, Item, MapObject, Sprite, Tile } from '@/application/types'
|
||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
|
|
||||||
@ -6,8 +6,8 @@ export const useAssetManagerStore = defineStore('assetManager', () => {
|
|||||||
const tileList = ref<Tile[]>([])
|
const tileList = ref<Tile[]>([])
|
||||||
const selectedTile = ref<Tile | null>(null)
|
const selectedTile = ref<Tile | null>(null)
|
||||||
|
|
||||||
const objectList = ref<Object[]>([])
|
const mapObjectList = ref<MapObject[]>([])
|
||||||
const selectedObject = ref<Object | null>(null)
|
const selectedMapObject = ref<MapObject | null>(null)
|
||||||
|
|
||||||
const spriteList = ref<Sprite[]>([])
|
const spriteList = ref<Sprite[]>([])
|
||||||
const selectedSprite = ref<Sprite | null>(null)
|
const selectedSprite = ref<Sprite | null>(null)
|
||||||
@ -29,12 +29,12 @@ export const useAssetManagerStore = defineStore('assetManager', () => {
|
|||||||
selectedTile.value = tile
|
selectedTile.value = tile
|
||||||
}
|
}
|
||||||
|
|
||||||
function setObjectList(objects: Object[]) {
|
function setMapObjectList(objects: MapObject[]) {
|
||||||
objectList.value = objects
|
mapObjectList.value = objects
|
||||||
}
|
}
|
||||||
|
|
||||||
function setSelectedObject(object: Object | null) {
|
function setSelectedObject(object: MapObject | null) {
|
||||||
selectedObject.value = object
|
selectedMapObject.value = object
|
||||||
}
|
}
|
||||||
|
|
||||||
function setSpriteList(sprites: Sprite[]) {
|
function setSpriteList(sprites: Sprite[]) {
|
||||||
@ -72,8 +72,8 @@ export const useAssetManagerStore = defineStore('assetManager', () => {
|
|||||||
return {
|
return {
|
||||||
tileList,
|
tileList,
|
||||||
selectedTile,
|
selectedTile,
|
||||||
objectList,
|
mapObjectList,
|
||||||
selectedObject,
|
selectedMapObject,
|
||||||
spriteList,
|
spriteList,
|
||||||
selectedSprite,
|
selectedSprite,
|
||||||
characterTypeList,
|
characterTypeList,
|
||||||
@ -84,9 +84,9 @@ export const useAssetManagerStore = defineStore('assetManager', () => {
|
|||||||
selectedItem,
|
selectedItem,
|
||||||
setTileList,
|
setTileList,
|
||||||
setSelectedTile,
|
setSelectedTile,
|
||||||
setObjectList,
|
setMapObjectList,
|
||||||
setCharacterTypeList,
|
setCharacterTypeList,
|
||||||
setSelectedObject,
|
setSelectedMapObject: setSelectedObject,
|
||||||
setSpriteList,
|
setSpriteList,
|
||||||
setSelectedSprite,
|
setSelectedSprite,
|
||||||
setSelectedCharacterType,
|
setSelectedCharacterType,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import type { Object, Tile, Map, MapEffect, PlacedMapObject } from '@/application/types'
|
import type { Map, MapEffect, MapObject, PlacedMapObject, Tile } from '@/application/types'
|
||||||
import { useGameStore } from '@/stores/gameStore'
|
import { useGameStore } from '@/stores/gameStore'
|
||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
|
|
||||||
@ -19,11 +19,11 @@ export const useMapEditorStore = defineStore('mapEditor', {
|
|||||||
eraserMode: 'tile',
|
eraserMode: 'tile',
|
||||||
mapList: [] as Map[],
|
mapList: [] as Map[],
|
||||||
tileList: [] as Tile[],
|
tileList: [] as Tile[],
|
||||||
objectList: [] as Object[],
|
mapObjectList: [] as MapObject[],
|
||||||
selectedTile: '',
|
selectedTile: '',
|
||||||
selectedObject: null as Object | null,
|
selectedObject: null as MapObject | null,
|
||||||
isTileListModalShown: false,
|
isTileListModalShown: false,
|
||||||
isObjectListModalShown: false,
|
isMapObjectListModalShown: false,
|
||||||
isMapListModalShown: false,
|
isMapListModalShown: false,
|
||||||
isCreateMapModalShown: false,
|
isCreateMapModalShown: false,
|
||||||
isSettingsModalShown: false,
|
isSettingsModalShown: false,
|
||||||
@ -85,13 +85,13 @@ export const useMapEditorStore = defineStore('mapEditor', {
|
|||||||
setTileList(tiles: Tile[]) {
|
setTileList(tiles: Tile[]) {
|
||||||
this.tileList = tiles
|
this.tileList = tiles
|
||||||
},
|
},
|
||||||
setObjectList(objects: Object[]) {
|
setMapObjectList(objects: MapObject[]) {
|
||||||
this.objectList = objects
|
this.mapObjectList = objects
|
||||||
},
|
},
|
||||||
setSelectedTile(tile: string) {
|
setSelectedTile(tile: string) {
|
||||||
this.selectedTile = tile
|
this.selectedTile = tile
|
||||||
},
|
},
|
||||||
setSelectedObject(object: Object) {
|
setSelectedObject(object: MapObject) {
|
||||||
this.selectedObject = object
|
this.selectedObject = object
|
||||||
},
|
},
|
||||||
toggleSettingsModal() {
|
toggleSettingsModal() {
|
||||||
@ -118,13 +118,13 @@ export const useMapEditorStore = defineStore('mapEditor', {
|
|||||||
if (resetMap) this.map = null
|
if (resetMap) this.map = null
|
||||||
this.mapList = []
|
this.mapList = []
|
||||||
this.tileList = []
|
this.tileList = []
|
||||||
this.objectList = []
|
this.mapObjectList = []
|
||||||
this.tool = 'move'
|
this.tool = 'move'
|
||||||
this.drawMode = 'tile'
|
this.drawMode = 'tile'
|
||||||
this.selectedTile = ''
|
this.selectedTile = ''
|
||||||
this.selectedObject = null
|
this.selectedObject = null
|
||||||
this.isTileListModalShown = false
|
this.isTileListModalShown = false
|
||||||
this.isObjectListModalShown = false
|
this.isMapObjectListModalShown = false
|
||||||
this.isSettingsModalShown = false
|
this.isSettingsModalShown = false
|
||||||
this.isMapListModalShown = false
|
this.isMapListModalShown = false
|
||||||
this.isCreateMapModalShown = false
|
this.isCreateMapModalShown = false
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import type { Map, MapCharacter } from '@/application/types'
|
import type { Map, MapCharacter, UUID } from '@/application/types'
|
||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
|
|
||||||
export const useMapStore = defineStore('map', {
|
export const useMapStore = defineStore('map', {
|
||||||
@ -11,7 +11,7 @@ export const useMapStore = defineStore('map', {
|
|||||||
},
|
},
|
||||||
getters: {
|
getters: {
|
||||||
getCharacterById: (state) => {
|
getCharacterById: (state) => {
|
||||||
return (id: number) => state.characters.find((char) => char.character.id === id)
|
return (id: UUID) => state.characters.find((char) => char.character.id === id)
|
||||||
},
|
},
|
||||||
getCharacterCount: (state) => {
|
getCharacterCount: (state) => {
|
||||||
return state.characters.length
|
return state.characters.length
|
||||||
@ -34,13 +34,13 @@ export const useMapStore = defineStore('map', {
|
|||||||
const index = this.characters.findIndex((char) => char.character.id === updatedCharacter.character.id)
|
const index = this.characters.findIndex((char) => char.character.id === updatedCharacter.character.id)
|
||||||
if (index !== -1) this.characters[index] = updatedCharacter
|
if (index !== -1) this.characters[index] = updatedCharacter
|
||||||
},
|
},
|
||||||
removeCharacter(characterId: number) {
|
removeCharacter(characterId: UUID) {
|
||||||
this.characters = this.characters.filter((char) => char.character.id !== characterId)
|
this.characters = this.characters.filter((char) => char.character.id !== characterId)
|
||||||
},
|
},
|
||||||
setCharacterLoaded(loaded: boolean) {
|
setCharacterLoaded(loaded: boolean) {
|
||||||
this.characterLoaded = loaded
|
this.characterLoaded = loaded
|
||||||
},
|
},
|
||||||
updateCharacterPosition(data: { characterId: number; positionX: number; positionY: number; rotation: number; isMoving: boolean }) {
|
updateCharacterPosition(data: { characterId: UUID; positionX: number; positionY: number; rotation: number; isMoving: boolean }) {
|
||||||
const character = this.characters.find((char) => char.character.id === data.characterId)
|
const character = this.characters.find((char) => char.character.id === data.characterId)
|
||||||
if (character) {
|
if (character) {
|
||||||
character.character.positionX = data.positionX
|
character.character.positionX = data.positionX
|
||||||
|
Loading…
x
Reference in New Issue
Block a user