76 lines
2.3 KiB
TypeScript
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) });
|