diff --git a/game-server/app/db/Equip.ts b/game-server/app/db/Equip.ts index 3634a8cfe..142eeaec5 100644 --- a/game-server/app/db/Equip.ts +++ b/game-server/app/db/Equip.ts @@ -20,21 +20,22 @@ export default class Equip extends BaseModel { eName: string; // 装备名称 @prop({ required: true }) seqId: number; // 装备表自增 id - @prop({ required: true }) + @prop({ required: false }) hid: number; // 装备此装备的武将 id - @prop({ required: true }) + @prop({ required: true, default: 1 }) lv: number; // 强化等级 + @prop({ required: false, default: [] }) randSe: [{ // 强化随机属性 seType: number; // 属性类型 value: number; // 属性数值 }]; - @prop({ required: true }) + @prop({ required: true, default: 0 }) randRange: number; // 物攻策攻数值浮动上下限变化率,浮点数 - @prop({ required: true }) + @prop({ required: true, default: 0 }) initHoleCnt: number; // 初始珠宝孔位个数 - @prop({ required: true }) + @prop({ required: true, default: [] }) holes: [{ id: number; // 宝石 id,待定,也可能是 type + lv lv: number; // 宝石等级 @@ -44,6 +45,16 @@ export default class Equip extends BaseModel { const equips = await EquipModel.find({ roleId }).lean(lean); return equips; } + + public static async createEquip(equipInfo: {roleId: string, roleName: string, eid: number, seqId: number, type: number, eName: string}, lean = true) { + const equip = await EquipModel.findOneAndUpdate({ seqId: equipInfo.seqId }, equipInfo, {upsert: true, new: true}).lean(); + return equip; + } + + public static async putOn(hid: number, equipId: string, lean = true) { + const equip = await EquipModel.findOneAndUpdate({ _id: equipId }, {hid}, {new: true}); + return equip; + } } export const EquipModel = getModelForClass(Equip); diff --git a/game-server/app/db/Hero.ts b/game-server/app/db/Hero.ts index a8ad03850..325600b5e 100644 --- a/game-server/app/db/Hero.ts +++ b/game-server/app/db/Hero.ts @@ -1,7 +1,6 @@ -import { COUNTER } from './../consts/consts'; -import { CounterModel } from './Counter'; import BaseModel from './BaseModel'; -import { index, getModelForClass, prop } from '@typegoose/typegoose'; +import { index, getModelForClass, prop, arrayProp, Ref, mongoose } from '@typegoose/typegoose'; +import Equip from './Equip'; /** * 英雄表 @@ -21,42 +20,52 @@ export default class Hero extends BaseModel { @prop({ required: true }) seqId: number; // 武将表自增 id - @prop({ required: true }) + @prop({ required: true, default: 0 }) exp: number; // 经验值 - @prop({ required: true }) + @prop({ required: true, default: 1 }) lv: number; // 武将等级 - @prop({ required: true }) + @prop({ required: true, default: 100 }) ce: number; // 武将战力 @prop({ required: true }) star: number; // 星级 - @prop({ required: true }) + @prop({ required: true, default: 1 }) rank: number; // 阶数 - @prop({ required: true }) + @prop({ required: true, default: 0 }) favour: number; // 好感度 - @prop({ required: true }) + @prop({ required: true, default: 1 }) favourLv: number; // 好感等级 - @prop({ required: true }) + @prop({ required: true, default: [] }) conections: [{ // 羁绊 id: number; // 羁绊编号 name: string; // 羁绊名称 valid: boolean; // 是否开启 }]; - @prop({ required: true }) + @prop({ required: true, default: [] }) skins: [{ // 皮肤 id: number; // id enable: boolean; // 是否装备 }] - equips: [ // 武将装备 - // ref: ObjectID; // 装备引用 - ]; + @prop({ ref: Equip, type: mongoose.Schema.Types.ObjectId }) + equips: Ref[]; // 武将装备引用数组 public static async findByRole(roleId: string, lean = true) { - const heros = await HeroModel.find({ roleId }).lean(lean); + const heros = await HeroModel.find({ roleId }).populate('equips').lean(lean); return heros || []; } + public static async addEquip(roleId: string, hid: number, equipId: string, lean = true) { + const hero = await HeroModel.findOneAndUpdate({ roleId, hid }, {$push: {equips: equipId}}, {new: true}).lean(lean); + await Equip.putOn(hero.hid, equipId); + return hero; + } + + public static async createHero(heroInfo: {roleId: string, roleName: string, hid: number, hName: string, seqId: number}, lean = true) { + const hero = await HeroModel.findOneAndUpdate({roleId: heroInfo.roleId, hid: heroInfo.hid}, heroInfo, {upsert: true, new: true}).lean(lean); + return hero; + } + } export const HeroModel = getModelForClass(Hero); diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index 9dbcd1d6a..83f2bbe2f 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -56,6 +56,9 @@ export class EntryHandler { session.set('rid', rid); session.set('uid', user.uid); session.set('roleId', role.roleId); + session.set('roleName', role.roleName); + session.push('roleId', () => {}); + session.push('roleName', () => {}); session.push('rid', function (err) { if (err) { console.error('set rid for session service failed! error is : %j', err.stack); diff --git a/game-server/app/servers/role/handler/roleHandler.ts b/game-server/app/servers/role/handler/roleHandler.ts index e69de29bb..56755a758 100644 --- a/game-server/app/servers/role/handler/roleHandler.ts +++ b/game-server/app/servers/role/handler/roleHandler.ts @@ -0,0 +1,60 @@ +import { CounterModel } from './../../../db/Counter'; +import { HeroModel } from './../../../db/Hero'; +import { EquipModel } from './../../../db/Equip'; +// import { roleRemote } from '../remote/roleRemote'; +import {Application, BackendSession, createTcpMailBox} from 'pinus'; +import { FrontendSession } from 'pinus'; +import Counter from '../../../db/Counter'; + +export default function(app: Application) { + return new RoleHandler(app); +} + +export class RoleHandler { + constructor(private app: Application) { + } + + async initEquips(roleId: string, roleName: string) { + const seqId = await CounterModel.getNewCounter('eid'); + const equipInfo = { + roleId, + roleName, + eid: 1, + eName: '倚天剑', + seqId, + type: 1 + } + const equip = await EquipModel.createEquip(equipInfo); + await HeroModel.addEquip(roleId, 1, equip._id); + } + + async initHeros(roleId: string, roleName: string) { + const seqId = await CounterModel.getNewCounter('hid'); + const heroInfo = { + roleId, + roleName, + hid: 1, + hName: '曹操', + seqId + } + await HeroModel.createHero(heroInfo); + } + + async initRole(msg: {content: string , target: string}, session: BackendSession) { + let roleId = session.get('roleId'); + let roleName = session.get('roleName'); + console.log('role in initRole: ', roleId, roleName); + + let heros = await HeroModel.findByRole(roleId); + if (!heros || heros.length === 0) { + await this.initHeros(roleId, roleName); + } + + let equips = await EquipModel.findbyRole(roleId); + if (!equips || equips.length === 0) { + await this.initEquips(roleId, roleName); + } + + console.log('initRole finish'); + } +} diff --git a/game-server/app/servers/role/remote/roleRemote.ts b/game-server/app/servers/role/remote/roleRemote.ts index e69de29bb..a96bdfcb8 100644 --- a/game-server/app/servers/role/remote/roleRemote.ts +++ b/game-server/app/servers/role/remote/roleRemote.ts @@ -0,0 +1,13 @@ +import { Application, ChannelService, FrontendSession, RemoterClass } from 'pinus'; + +export default function (app: Application) { + return new RoleRemote(app); +} + +export class RoleRemote { + + constructor(private app: Application) { + this.app = app; + this.channelService = app.get('channelService'); + } +} diff --git a/game-server/config/servers.ts b/game-server/config/servers.ts index 2b77b189c..e179eca03 100644 --- a/game-server/config/servers.ts +++ b/game-server/config/servers.ts @@ -16,6 +16,9 @@ module.exports = { {'id': 'chat-server-2', 'host': '127.0.0.1', 'port': 6051, 'args': '--inspect=10004'}, {'id': 'chat-server-3', 'host': '127.0.0.1', 'port': 6052, 'args': '--inspect=10005'} ], + 'role': [ + {'id': 'role-server-1', 'host': '127.0.0.1', 'port': 6053, 'args': '--inspect=10006'} + ], 'gate': [ { 'id': 'gate-server-1', @@ -38,6 +41,9 @@ module.exports = { {'id': 'chat-server-2', 'host': '127.0.0.1', 'port': 6051}, {'id': 'chat-server-3', 'host': '127.0.0.1', 'port': 6052} ], + 'role': [ + {'id': 'role-server-1', 'host': '127.0.0.1', 'port': 6053, 'args': '--inspect=10006'} + ], 'gate': [ {'id': 'gate-server-1', 'host': '127.0.0.1', 'clientHost': 'pinus_test.trgame.cn', 'clientPort': 3014, 'frontend': true} ] diff --git a/web-server/app/db/Hero.ts b/web-server/app/db/Hero.ts index 5e2b86356..0733f5929 100644 --- a/web-server/app/db/Hero.ts +++ b/web-server/app/db/Hero.ts @@ -1,5 +1,6 @@ import BaseModel from './BaseModel'; -import { index, getModelForClass, prop } from '@typegoose/typegoose'; +import { index, getModelForClass, prop, arrayProp, Ref } from '@typegoose/typegoose'; +import Equip from './Equip'; /** * 英雄表 @@ -44,12 +45,10 @@ export default class Hero extends BaseModel { skins: [{ // 皮肤 id: number; // id enable: boolean; // 是否装备 - }] - - equips: [ // 武将装备 - // ref: ObjectID; // 装备引用 - ]; + }]; + @prop({ ref: Equip }) + equips: Ref[]; // 武将装备引用数组 } export const HeroModel = getModelForClass(Hero);