ran prettier
This commit is contained in:
parent
0eaeaf7cfb
commit
45a7e9331b
@ -1,9 +1,9 @@
|
|||||||
<script lang="typescript">
|
<script lang="typescript">
|
||||||
import { actionsMenuStore } from '../../Stores/ActionsMenuStore';
|
import { actionsMenuStore } from "../../Stores/ActionsMenuStore";
|
||||||
import { onDestroy } from "svelte";
|
import { onDestroy } from "svelte";
|
||||||
|
|
||||||
import type { Unsubscriber } from "svelte/store";
|
import type { Unsubscriber } from "svelte/store";
|
||||||
import type { ActionsMenuData } from '../../Stores/ActionsMenuStore';
|
import type { ActionsMenuData } from "../../Stores/ActionsMenuStore";
|
||||||
|
|
||||||
let actionsMenuData: ActionsMenuData | undefined;
|
let actionsMenuData: ActionsMenuData | undefined;
|
||||||
|
|
||||||
@ -19,7 +19,7 @@
|
|||||||
actionsMenuStore.clear();
|
actionsMenuStore.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
actionsMenuStoreUnsubscriber = actionsMenuStore.subscribe(value => {
|
actionsMenuStoreUnsubscriber = actionsMenuStore.subscribe((value) => {
|
||||||
actionsMenuData = value;
|
actionsMenuData = value;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -28,7 +28,6 @@
|
|||||||
actionsMenuStoreUnsubscriber();
|
actionsMenuStoreUnsubscriber();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:window on:keydown={onKeyDown} />
|
<svelte:window on:keydown={onKeyDown} />
|
||||||
@ -42,17 +41,19 @@
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="nes-btn"
|
class="nes-btn"
|
||||||
on:click|preventDefault={() => { callback(); }}
|
on:click|preventDefault={() => {
|
||||||
|
callback();
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
{actionName}
|
{actionName}
|
||||||
</button>
|
</button>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.actions-menu {
|
.actions-menu {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translate(-50%, 0);
|
transform: translate(-50%, 0);
|
||||||
@ -69,9 +70,9 @@
|
|||||||
.actions {
|
.actions {
|
||||||
max-height: calc(100% - 50px);
|
max-height: calc(100% - 50px);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display:block;
|
display: block;
|
||||||
overflow-x:hidden;
|
overflow-x: hidden;
|
||||||
overflow-y:auto;
|
overflow-y: auto;
|
||||||
|
|
||||||
button {
|
button {
|
||||||
width: calc(100% - 10px);
|
width: calc(100% - 10px);
|
||||||
@ -95,4 +96,4 @@
|
|||||||
right: -20px;
|
right: -20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -36,8 +36,8 @@
|
|||||||
import LimitRoomModal from "./Modal/LimitRoomModal.svelte";
|
import LimitRoomModal from "./Modal/LimitRoomModal.svelte";
|
||||||
import ShareLinkMapModal from "./Modal/ShareLinkMapModal.svelte";
|
import ShareLinkMapModal from "./Modal/ShareLinkMapModal.svelte";
|
||||||
import { LayoutMode } from "../WebRtc/LayoutManager";
|
import { LayoutMode } from "../WebRtc/LayoutManager";
|
||||||
import { actionsMenuStore } from '../Stores/ActionsMenuStore';
|
import { actionsMenuStore } from "../Stores/ActionsMenuStore";
|
||||||
import ActionsMenu from './ActionsMenu/ActionsMenu.svelte';
|
import ActionsMenu from "./ActionsMenu/ActionsMenu.svelte";
|
||||||
|
|
||||||
let mainLayout: HTMLDivElement;
|
let mainLayout: HTMLDivElement;
|
||||||
|
|
||||||
@ -107,7 +107,7 @@ import ActionsMenu from './ActionsMenu/ActionsMenu.svelte';
|
|||||||
{#if $followStateStore !== "off" || $peerStore.size > 0}
|
{#if $followStateStore !== "off" || $peerStore.size > 0}
|
||||||
<FollowMenu />
|
<FollowMenu />
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if $actionsMenuStore}
|
{#if $actionsMenuStore}
|
||||||
<ActionsMenu />
|
<ActionsMenu />
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -15,7 +15,7 @@ import { TexturesHelper } from "../Helpers/TexturesHelper";
|
|||||||
import type { PictureStore } from "../../Stores/PictureStore";
|
import type { PictureStore } from "../../Stores/PictureStore";
|
||||||
import { Unsubscriber, Writable, writable } from "svelte/store";
|
import { Unsubscriber, Writable, writable } from "svelte/store";
|
||||||
import { createColorStore } from "../../Stores/OutlineColorStore";
|
import { createColorStore } from "../../Stores/OutlineColorStore";
|
||||||
import type { OutlineableInterface } from '../Game/OutlineableInterface';
|
import type { OutlineableInterface } from "../Game/OutlineableInterface";
|
||||||
import type CancelablePromise from "cancelable-promise";
|
import type CancelablePromise from "cancelable-promise";
|
||||||
|
|
||||||
const playerNameY = -25;
|
const playerNameY = -25;
|
||||||
@ -155,7 +155,7 @@ export abstract class Character extends Container implements OutlineableInterfac
|
|||||||
return this.clickable;
|
return this.clickable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public getPosition(): { x: number, y: number } {
|
public getPosition(): { x: number; y: number } {
|
||||||
return { x: this.x, y: this.y };
|
return { x: this.x, y: this.y };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,23 +1,21 @@
|
|||||||
|
|
||||||
import { requestVisitCardsStore } from "../../Stores/GameStore";
|
import { requestVisitCardsStore } from "../../Stores/GameStore";
|
||||||
import { ActionsMenuData, actionsMenuStore } from '../../Stores/ActionsMenuStore';
|
import { ActionsMenuData, actionsMenuStore } from "../../Stores/ActionsMenuStore";
|
||||||
import { Character } from "../Entity/Character";
|
import { Character } from "../Entity/Character";
|
||||||
import type { GameScene } from "../Game/GameScene";
|
import type { GameScene } from "../Game/GameScene";
|
||||||
import type { PointInterface } from "../../Connexion/ConnexionModels";
|
import type { PointInterface } from "../../Connexion/ConnexionModels";
|
||||||
import type { PlayerAnimationDirections } from "../Player/Animation";
|
import type { PlayerAnimationDirections } from "../Player/Animation";
|
||||||
import type { Unsubscriber } from 'svelte/store';
|
import type { Unsubscriber } from "svelte/store";
|
||||||
import type { ActivatableInterface } from '../Game/ActivatableInterface';
|
import type { ActivatableInterface } from "../Game/ActivatableInterface";
|
||||||
import type CancelablePromise from "cancelable-promise";
|
import type CancelablePromise from "cancelable-promise";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class representing the sprite of a remote player (a player that plays on another computer)
|
* Class representing the sprite of a remote player (a player that plays on another computer)
|
||||||
*/
|
*/
|
||||||
export class RemotePlayer extends Character implements ActivatableInterface {
|
export class RemotePlayer extends Character implements ActivatableInterface {
|
||||||
|
|
||||||
public userId: number;
|
public userId: number;
|
||||||
public readonly activationRadius: number;
|
public readonly activationRadius: number;
|
||||||
|
|
||||||
private registeredActions: { actionName: string, callback: Function }[];
|
private registeredActions: { actionName: string; callback: Function }[];
|
||||||
private visitCardUrl: string | null;
|
private visitCardUrl: string | null;
|
||||||
private isActionsMenuInitialized: boolean = false;
|
private isActionsMenuInitialized: boolean = false;
|
||||||
private actionsMenuStoreUnsubscriber: Unsubscriber;
|
private actionsMenuStoreUnsubscriber: Unsubscriber;
|
||||||
@ -34,21 +32,9 @@ export class RemotePlayer extends Character implements ActivatableInterface {
|
|||||||
visitCardUrl: string | null,
|
visitCardUrl: string | null,
|
||||||
companion: string | null,
|
companion: string | null,
|
||||||
companionTexturePromise?: Promise<string>,
|
companionTexturePromise?: Promise<string>,
|
||||||
activationRadius?: number,
|
activationRadius?: number
|
||||||
) {
|
) {
|
||||||
super(
|
super(Scene, x, y, texturesPromise, name, direction, moving, 1, true, companion, companionTexturePromise);
|
||||||
Scene,
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
texturesPromise,
|
|
||||||
name,
|
|
||||||
direction,
|
|
||||||
moving,
|
|
||||||
1,
|
|
||||||
true,
|
|
||||||
companion,
|
|
||||||
companionTexturePromise
|
|
||||||
);
|
|
||||||
|
|
||||||
//set data
|
//set data
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
@ -76,13 +62,13 @@ export class RemotePlayer extends Character implements ActivatableInterface {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public registerActionsMenuAction(action: { actionName: string, callback: Function }): void {
|
public registerActionsMenuAction(action: { actionName: string; callback: Function }): void {
|
||||||
this.registeredActions.push(action);
|
this.registeredActions.push(action);
|
||||||
this.updateIsClickable();
|
this.updateIsClickable();
|
||||||
}
|
}
|
||||||
|
|
||||||
public unregisterActionsMenuAction(actionName: string) {
|
public unregisterActionsMenuAction(actionName: string) {
|
||||||
const index = this.registeredActions.findIndex(action => action.actionName === actionName);
|
const index = this.registeredActions.findIndex((action) => action.actionName === actionName);
|
||||||
if (index !== -1) {
|
if (index !== -1) {
|
||||||
this.registeredActions.splice(index, 1);
|
this.registeredActions.splice(index, 1);
|
||||||
}
|
}
|
||||||
@ -125,7 +111,7 @@ export class RemotePlayer extends Character implements ActivatableInterface {
|
|||||||
callback: () => {
|
callback: () => {
|
||||||
requestVisitCardsStore.set(this.visitCardUrl);
|
requestVisitCardsStore.set(this.visitCardUrl);
|
||||||
actionsMenuStore.clear();
|
actionsMenuStore.clear();
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
|
|
||||||
export interface ActivatableInterface {
|
export interface ActivatableInterface {
|
||||||
readonly activationRadius: number;
|
readonly activationRadius: number;
|
||||||
isActivatable: () => boolean;
|
isActivatable: () => boolean;
|
||||||
activate: () => void;
|
activate: () => void;
|
||||||
getPosition: () => { x: number, y: number };
|
getPosition: () => { x: number; y: number };
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
import { isOutlineable } from '../../Utils/CustomTypeGuards';
|
import { isOutlineable } from "../../Utils/CustomTypeGuards";
|
||||||
import { MathUtils } from '../../Utils/MathUtils';
|
import { MathUtils } from "../../Utils/MathUtils";
|
||||||
import type { Player } from '../Player/Player';
|
import type { Player } from "../Player/Player";
|
||||||
import type { ActivatableInterface } from './ActivatableInterface';
|
import type { ActivatableInterface } from "./ActivatableInterface";
|
||||||
|
|
||||||
export class ActivatablesManager {
|
export class ActivatablesManager {
|
||||||
|
|
||||||
// The item that can be selected by pressing the space key.
|
// The item that can be selected by pressing the space key.
|
||||||
private selectedActivatableObjectByDistance?: ActivatableInterface;
|
private selectedActivatableObjectByDistance?: ActivatableInterface;
|
||||||
private selectedActivatableObjectByPointer?: ActivatableInterface;
|
private selectedActivatableObjectByPointer?: ActivatableInterface;
|
||||||
private activatableObjectsDistances: Map<ActivatableInterface, number> = new Map<ActivatableInterface, number>();
|
private activatableObjectsDistances: Map<ActivatableInterface, number> = new Map<ActivatableInterface, number>();
|
||||||
|
|
||||||
private currentPlayer: Player;
|
private currentPlayer: Player;
|
||||||
|
|
||||||
constructor(currentPlayer: Player) {
|
constructor(currentPlayer: Player) {
|
||||||
this.currentPlayer = currentPlayer;
|
this.currentPlayer = currentPlayer;
|
||||||
}
|
}
|
||||||
@ -54,7 +53,7 @@ export class ActivatablesManager {
|
|||||||
// update value but do not change the outline
|
// update value but do not change the outline
|
||||||
if (this.selectedActivatableObjectByPointer) {
|
if (this.selectedActivatableObjectByPointer) {
|
||||||
this.selectedActivatableObjectByDistance = newNearestObject;
|
this.selectedActivatableObjectByDistance = newNearestObject;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (isOutlineable(this.selectedActivatableObjectByDistance)) {
|
if (isOutlineable(this.selectedActivatableObjectByDistance)) {
|
||||||
this.selectedActivatableObjectByDistance?.characterFarAwayOutline();
|
this.selectedActivatableObjectByDistance?.characterFarAwayOutline();
|
||||||
@ -88,7 +87,7 @@ export class ActivatablesManager {
|
|||||||
public updateDistanceForSingleActivatableObject(object: ActivatableInterface): void {
|
public updateDistanceForSingleActivatableObject(object: ActivatableInterface): void {
|
||||||
this.activatableObjectsDistances.set(
|
this.activatableObjectsDistances.set(
|
||||||
object,
|
object,
|
||||||
MathUtils.distanceBetween(this.currentPlayer.getPosition(), object.getPosition()),
|
MathUtils.distanceBetween(this.currentPlayer.getPosition(), object.getPosition())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ import { GameMapPropertiesListener } from "./GameMapPropertiesListener";
|
|||||||
import { analyticsClient } from "../../Administration/AnalyticsClient";
|
import { analyticsClient } from "../../Administration/AnalyticsClient";
|
||||||
import { GameMapProperties } from "./GameMapProperties";
|
import { GameMapProperties } from "./GameMapProperties";
|
||||||
import { PathfindingManager } from "../../Utils/PathfindingManager";
|
import { PathfindingManager } from "../../Utils/PathfindingManager";
|
||||||
import { ActivatablesManager } from './ActivatablesManager';
|
import { ActivatablesManager } from "./ActivatablesManager";
|
||||||
import type {
|
import type {
|
||||||
GroupCreatedUpdatedMessageInterface,
|
GroupCreatedUpdatedMessageInterface,
|
||||||
MessageUserMovedInterface,
|
MessageUserMovedInterface,
|
||||||
@ -805,10 +805,9 @@ export class GameScene extends DirtyScene {
|
|||||||
this.simplePeer = new SimplePeer(this.connection);
|
this.simplePeer = new SimplePeer(this.connection);
|
||||||
userMessageManager.setReceiveBanListener(this.bannedUser.bind(this));
|
userMessageManager.setReceiveBanListener(this.bannedUser.bind(this));
|
||||||
|
|
||||||
this.CurrentPlayer.on(
|
this.CurrentPlayer.on(hasMovedEventName, (event: HasPlayerMovedEvent) => {
|
||||||
hasMovedEventName,
|
this.handleCurrentPlayerHasMovedEvent(event);
|
||||||
(event: HasPlayerMovedEvent) => { this.handleCurrentPlayerHasMovedEvent(event); },
|
});
|
||||||
);
|
|
||||||
|
|
||||||
// Set up variables manager
|
// Set up variables manager
|
||||||
this.sharedVariablesManager = new SharedVariablesManager(
|
this.sharedVariablesManager = new SharedVariablesManager(
|
||||||
@ -1685,7 +1684,10 @@ ${escapedMessage}
|
|||||||
//listen event to share position of user
|
//listen event to share position of user
|
||||||
this.pushPlayerPosition(event);
|
this.pushPlayerPosition(event);
|
||||||
this.gameMap.setPosition(event.x, event.y);
|
this.gameMap.setPosition(event.x, event.y);
|
||||||
this.activatablesManager.updateActivatableObjectsDistances([...Array.from(this.MapPlayersByKey.values()), ...this.actionableItems.values()]);
|
this.activatablesManager.updateActivatableObjectsDistances([
|
||||||
|
...Array.from(this.MapPlayersByKey.values()),
|
||||||
|
...this.actionableItems.values(),
|
||||||
|
]);
|
||||||
this.activatablesManager.deduceSelectedActivatableObjectByDistance();
|
this.activatablesManager.deduceSelectedActivatableObjectByDistance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
|
|
||||||
export interface OutlineableInterface {
|
export interface OutlineableInterface {
|
||||||
setFollowOutlineColor(color: number): void
|
setFollowOutlineColor(color: number): void;
|
||||||
removeFollowOutlineColor(): void
|
removeFollowOutlineColor(): void;
|
||||||
setApiOutlineColor(color: number): void
|
setApiOutlineColor(color: number): void;
|
||||||
removeApiOutlineColor(): void
|
removeApiOutlineColor(): void;
|
||||||
pointerOverOutline(): void
|
pointerOverOutline(): void;
|
||||||
pointerOutOutline(): void
|
pointerOutOutline(): void;
|
||||||
characterCloseByOutline(): void
|
characterCloseByOutline(): void;
|
||||||
characterFarAwayOutline(): void
|
characterFarAwayOutline(): void;
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,11 @@
|
|||||||
import Sprite = Phaser.GameObjects.Sprite;
|
import Sprite = Phaser.GameObjects.Sprite;
|
||||||
import type { GameScene } from "../Game/GameScene";
|
import type { GameScene } from "../Game/GameScene";
|
||||||
import type OutlinePipelinePlugin from "phaser3-rex-plugins/plugins/outlinepipeline-plugin.js";
|
import type OutlinePipelinePlugin from "phaser3-rex-plugins/plugins/outlinepipeline-plugin.js";
|
||||||
import type { ActivatableInterface } from '../Game/ActivatableInterface';
|
import type { ActivatableInterface } from "../Game/ActivatableInterface";
|
||||||
|
|
||||||
type EventCallback = (state: unknown, parameters: unknown) => void;
|
type EventCallback = (state: unknown, parameters: unknown) => void;
|
||||||
|
|
||||||
export class ActionableItem implements ActivatableInterface{
|
export class ActionableItem implements ActivatableInterface {
|
||||||
private readonly activationRadiusSquared: number;
|
private readonly activationRadiusSquared: number;
|
||||||
private isSelectable: boolean = false;
|
private isSelectable: boolean = false;
|
||||||
private callbacks: Map<string, Array<EventCallback>> = new Map<string, Array<EventCallback>>();
|
private callbacks: Map<string, Array<EventCallback>> = new Map<string, Array<EventCallback>>();
|
||||||
@ -41,7 +41,7 @@ export class ActionableItem implements ActivatableInterface{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public getPosition(): { x: number, y: number } {
|
public getPosition(): { x: number; y: number } {
|
||||||
return { x: this.sprite.x, y: this.sprite.y };
|
return { x: this.sprite.x, y: this.sprite.y };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Player } from '../Player/Player';
|
import { Player } from "../Player/Player";
|
||||||
import { RemotePlayer } from '../Entity/RemotePlayer';
|
import { RemotePlayer } from "../Entity/RemotePlayer";
|
||||||
|
|
||||||
import type { UserInputHandlerInterface } from "../../Interfaces/UserInputHandlerInterface";
|
import type { UserInputHandlerInterface } from "../../Interfaces/UserInputHandlerInterface";
|
||||||
import type { GameScene } from "../Game/GameScene";
|
import type { GameScene } from "../Game/GameScene";
|
||||||
@ -55,7 +55,7 @@ export class GameSceneUserInputHandler implements UserInputHandlerInterface {
|
|||||||
public handleSpaceKeyUpEvent(event: Event): Event {
|
public handleSpaceKeyUpEvent(event: Event): Event {
|
||||||
const activatable = this.gameScene.getActivatablesManager().getSelectedActivatableObject();
|
const activatable = this.gameScene.getActivatablesManager().getSelectedActivatableObject();
|
||||||
if (activatable && activatable.isActivatable()) {
|
if (activatable && activatable.isActivatable()) {
|
||||||
activatable.activate();
|
activatable.activate();
|
||||||
}
|
}
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,10 @@ import { writable } from "svelte/store";
|
|||||||
|
|
||||||
export interface ActionsMenuData {
|
export interface ActionsMenuData {
|
||||||
playerName: string;
|
playerName: string;
|
||||||
actions: {actionName: string, callback: Function }[];
|
actions: { actionName: string; callback: Function }[];
|
||||||
}
|
}
|
||||||
|
|
||||||
function createActionsMenuStore() {
|
function createActionsMenuStore() {
|
||||||
|
|
||||||
const { subscribe, update, set } = writable<ActionsMenuData | undefined>(undefined);
|
const { subscribe, update, set } = writable<ActionsMenuData | undefined>(undefined);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@ -25,7 +24,7 @@ function createActionsMenuStore() {
|
|||||||
},
|
},
|
||||||
removeAction: (actionName: string) => {
|
removeAction: (actionName: string) => {
|
||||||
update((data) => {
|
update((data) => {
|
||||||
const actionIndex = data?.actions.findIndex(action => action.actionName === actionName);
|
const actionIndex = data?.actions.findIndex((action) => action.actionName === actionName);
|
||||||
if (actionIndex !== undefined && actionIndex != -1) {
|
if (actionIndex !== undefined && actionIndex != -1) {
|
||||||
data?.actions.splice(actionIndex, 1);
|
data?.actions.splice(actionIndex, 1);
|
||||||
}
|
}
|
||||||
@ -37,7 +36,7 @@ function createActionsMenuStore() {
|
|||||||
*/
|
*/
|
||||||
clear: () => {
|
clear: () => {
|
||||||
set(undefined);
|
set(undefined);
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ export function createColorStore() {
|
|||||||
|
|
||||||
let followColor: number | undefined = undefined;
|
let followColor: number | undefined = undefined;
|
||||||
let apiColor: number | undefined = undefined;
|
let apiColor: number | undefined = undefined;
|
||||||
|
|
||||||
let pointedByPointer: boolean = false;
|
let pointedByPointer: boolean = false;
|
||||||
let pointedByCharacter: boolean = false;
|
let pointedByCharacter: boolean = false;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import type { OutlineableInterface } from '../Phaser/Game/OutlineableInterface';
|
import type { OutlineableInterface } from "../Phaser/Game/OutlineableInterface";
|
||||||
|
|
||||||
export function isOutlineable(object: unknown): object is OutlineableInterface {
|
export function isOutlineable(object: unknown): object is OutlineableInterface {
|
||||||
return (object as OutlineableInterface)?.pointerOverOutline !== undefined;
|
return (object as OutlineableInterface)?.pointerOverOutline !== undefined;
|
||||||
|
Loading…
Reference in New Issue
Block a user