继承于Subdata的数据中心脚本如何获取对应玩家?

[复制链接]
372 |10
天启 发表于 2024-10-17 21:39:47 | 显示全部楼层 |阅读模式
1.这是服务端脚本把?  
2.只能生成时自己定义一个玩家id属性吗?
回复

使用道具 举报

六安🐟片 发表于 2024-10-18 09:54:48 | 显示全部楼层
1. 继承Subdata的数据类是可以双端调用的。
Subdata是在DataCenter中进行管理的,服务端是权威端,客户端同时会有一份同步的数据。修改时需要在服务端修改并调用save(true),达到保存且同步到客户端的作用。

2. Subdata是属于单个玩家的数据。
数据类创建后,每个玩家都会有一份继承Subdata的数据类。Subdata定义时,可以在可序列化的数据上方标注@Decorator.persistence()装饰器,来标识需要被存储的字段,同时可以被同步到客户端。
在服务端获取一个玩家的数据方法:

// 定义一个商店数据
export class ShopData extends Subdata {

    /** 已购买商品id数组 */
    @Decorator.persistence()
    public boughtItems:
number[] = [];
}


// 服务端模块调用

export class ShopModuleS extends ModuleS<ShopModuleC, ShopData> {
    protected onPlayerEnterGame(player: mw.Player): void {
        const playerShopData = this.getPlayerData(player);
        console.log(`玩家${player.playerId}购买的所有商品`,playerShopData.boughtItems)
    }
}

// 客户端模块调用

export class ShopModuleC extends ModuleC<ShopModuleS, ShopData> {
    protected onEnterScene(sceneType: number): void {
        console.log("玩家购买的所有商品:", this.data.boughtItems)
    }
}



回复

使用道具 举报

丸子 发表于 2024-10-18 09:59:16 | 显示全部楼层
本帖最后由 丸子 于 2024-10-18 10:01 编辑

可以看一下这个Subdata的使用
https://api-docs.ark.online/classes/mwext.Subdata.html
//AppleData就是继承于Subdata的类 

//获取玩家自己的数据,传入this.currentPlayer
let curPlayer = DataCenterS.getData(this.currentPlayer, AppleData);


//获取其他玩家的数据,传入对应玩家的userId
const otherPlayer = DataCenterS.getData(player, AppleData);

回复

使用道具 举报

天启楼主 发表于 2024-10-18 14:03:47 | 显示全部楼层
丸子 发表于 2024-10-18 09:59
可以看一下这个Subdata的使用
https://api-docs.ark.online/classes/mwext.Subdata.html
《---myCode-TypeS ...

playerData类里没有player相关的属性,所以是没法this.curPlayer的,我问得就是怎么在此类中获取玩家呀
回复

使用道具 举报

天启楼主 发表于 2024-10-18 14:05:30 | 显示全部楼层
六安🐟片 发表于 2024-10-18 09:54
1. 继承Subdata的数据类是可以双端调用的。
Subdata是在DataCenter中进行管理的,服务端是权威端,客户端同 ...

大佬麻烦看一下标题,我问的是怎么在PlayerData脚本里获取玩家
回复

使用道具 举报

六安🐟片 发表于 2024-10-18 14:06:21 | 显示全部楼层
天启 发表于 2024-10-18 14:03
playerData类里没有player相关的属性,所以是没法this.curPlayer的,我问得就是怎么在此类中获取玩家呀 ...

这个类就是你要通过player才能获取到的。不需要通过这个类获取player啊
回复

使用道具 举报

天启楼主 发表于 2024-10-19 10:26:29 | 显示全部楼层
六安🐟片 发表于 2024-10-18 14:06
这个类就是你要通过player才能获取到的。不需要通过这个类获取player啊

我要在这类里面使用player
回复

使用道具 举报

六安🐟片 发表于 2024-10-19 17:08:31 | 显示全部楼层
天启 发表于 2024-10-19 10:26
我要在这类里面使用player

数据类中应该只处理数据相关内容,不应该在这里使用player对象。建议在数据类外的module层就进行处理好player相关的信息。或者在数据类中定义一些方法,可以从将player作为参数传进来处理一些信息。
回复

使用道具 举报

天启楼主 发表于 2024-10-19 17:24:58 | 显示全部楼层
六安🐟片 发表于 2024-10-19 17:08
数据类中应该只处理数据相关内容,不应该在这里使用player对象。建议在数据类外的module层就进行处理好pl ...

数据中心处理数据时都是在服务端,我需要往客户端同步UI显示,没player怎么派发事件啊
回复

使用道具 举报

六安🐟片 发表于 2024-10-19 17:31:21 | 显示全部楼层
天启 发表于 2024-10-19 17:24
数据中心处理数据时都是在服务端,我需要往客户端同步UI显示,没player怎么派发事件啊 ...

你应该在ModuleS中发消息,而不是数据类里面,举个例子
  1. // 定义一个商店数据
  2. export class ShopData extends Subdata {

  3.     /** 已购买商品id数组 */
  4.     @Decorator.persistence()
  5.     public boughtItems: number[] = [];

  6.     addItem(itemId: number) {
  7.         this.boughtItems.push(itemId);
  8.         this.save(true);
  9.     }
  10. }


  11. // 服务端模块调用

  12. export class ShopModuleS extends ModuleS<ShopModuleC, ShopData> {
  13.     protected onPlayerEnterGame(player: mw.Player): void {
  14.         const playerShopData = this.getPlayerData(player);
  15.         console.log(`玩家${player.playerId}购买的所有商品`, playerShopData.boughtItems)
  16.     }

  17.     net_addItem(itemId: number, playerId: number) {
  18.         const playerData = this.getPlayerData(playerId);
  19.         playerData.addItem(itemId);
  20.         Event.dispatchToClient(Player.getPlayer(playerId), "onAddItem");
  21.     }
  22. }
复制代码
回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表