Files
node-metaverse/examples/Region/Agents.ts
Casper Warden 43723d351e #31: Ability to get a list of all avatars in region
Added example of tracking of agents
Removed some debug logging
2020-12-01 12:25:56 +00:00

76 lines
2.3 KiB
TypeScript

import { ExampleBot } from '../ExampleBot';
import { Avatar } from '../../lib/classes/public/Avatar';
import { Subscription } from 'rxjs';
class Region extends ExampleBot
{
private subscriptions: {[key: string]: {
onMovedSubscription: Subscription;
onTitleSubscription: Subscription;
onLeftRegionSubscription: Subscription;
onVisibleSubscription: Subscription;
}};
async onConnected()
{
this.bot.clientEvents.onAvatarEnteredRegion.subscribe(this.onAvatarEntered.bind(this));
const avs = this.bot.clientCommands.region.getAvatarsInRegion();
for (const av of avs)
{
this.onAvatarEntered(av);
}
}
onAvatarEntered(av: Avatar)
{
console.log(av.getName() + ' entered the region (' + ((av.isVisible) ? 'visible' : 'invisible') + ')');
const avatarKey = av.getKey().toString();
this.unsubscribe(avatarKey);
this.subscriptions[avatarKey] = {
onLeftRegionSubscription: av.onLeftRegion.subscribe(this.onAvatarLeft.bind(this)),
onMovedSubscription: av.onMoved.subscribe(this.onAvatarMoved.bind(this)),
onTitleSubscription: av.onTitleChanged.subscribe(this.onTitleChanged.bind(this)),
onVisibleSubscription: av.onVisibleChanged.subscribe(this.onAvatarVisible.bind(this))
}
}
private unsubscribe(key: string)
{
const sub = this.subscriptions[key];
if (sub === undefined)
{
return;
}
delete this.subscriptions[key];
sub.onVisibleSubscription.unsubscribe();
sub.onMovedSubscription.unsubscribe();
sub.onTitleSubscription.unsubscribe();
sub.onLeftRegionSubscription.unsubscribe();
}
onAvatarLeft(av: Avatar)
{
console.log(av.getName() + ' left the region');
this.unsubscribe(av.getKey().toString());
}
onAvatarMoved(av: Avatar)
{
console.log(av.getName() + ' moved, position: ' + av.position.toString());
}
onTitleChanged(av: Avatar)
{
console.log(av.getName() + ' changed their title to: ' + av.getTitle());
}
onAvatarVisible(av: Avatar)
{
console.log(av.getName() + ' is now ' + (av.isVisible ? 'visible' : 'invisible'));
}
}
new Region().run().then(() => {}).catch((err) => { console.error(err) });