I am trying to create a framework in javascript. I wanted to try to create a player class by doing this:
class Test {
name
constructor(_name) {
this.name = _name
}
printsomething() {
console.log("printed this")
}
}
let Player = new Test("jdaida")
exports('getPlayer', () => {
return Player
})
on('getPlayer', (cb) => {
cb(Player)
})
but when i try to get the player in another script by doing this:
RegisterCommand("test", () => {
let corePlayer = exports.ScriptJS.getPlayer()
corePlayer.printsomething()
})
emit('getPlayer', (resp) => {
resp.printsomething()
})
I get this error:
Does anyone know how to do this?
Make a function to return an object instead of the class prototype
// Psudo code
class Player {
getName()
getMoney()
...
getPlyObj() {
return {
getName: this.getName,
getMoney: this.getMoney,
}
}
}
It does not work for functions like theese
// Main script
class Test {
name
constructor(_name) {
this.name = _name
}
setName(newName) {
this.name = newName
}
getName() {
return this.name
}
copy() {
return {
name: this.name,
getName: this.getName,
setName: this.setName,
}
}
}
let Player = new Test("jdaida")
on('getPlayer', (cb) => {
cb(Player.copy())
})
// Caller script
emit('getPlayer', (resp) => {
console.log(resp.name) // Returns name
console.log(resp.getName()) // Returns null
})
Hi @Momin14,
It seems that the object loses its context when you try to export it.
The simplest option, if you need to use classes is to do multiple exports.
I have prepared an example for you
// provider/client.js
class PlayerBlueprint {
_name;
constructor(name) {
this._name = name;
}
set name(name) {
this._name = name;
}
get name() {
return this._name;
}
}
const player = new PlayerBlueprint(GetPlayerName(PlayerId()));
exports("getPlayerName", () => player.name);
exports("setPlayerName", (name) => player.name = name);
// customer/client.js
(() => {
console.log(exports["user-provider"]["getPlayerName"]());
exports["user-provider"]["setPlayerName"]('SomeoneNew');
console.log(exports["user-provider"]["getPlayerName"]());
})();
If you wish, you can also do something like this
// provider/client.js
const player = {
_name: '',
getName: () => this._name,
setName: (name) => this._name = name
}
player.setName(GetPlayerName(PlayerId()));
exports("getPlayer", () => player);
// customer/client.js
(() => {
console.log(exports["user-provider"]["getPlayer"]().getName());
exports["user-provider"]["getPlayer"]().setName("SomeoneNew");
console.log(exports["user-provider"]["getPlayer"]().getName());
})();