368 lines
12 KiB
TypeScript
368 lines
12 KiB
TypeScript
import DB from "../utils/DB";
|
||
import GameUtil from "../core/GameUtil";
|
||
import PlayerMgr from "./PlayerMgr";
|
||
import Relation from "./Relation";
|
||
import SKDataUtil from "../gear/SKDataUtil";
|
||
import SKLogger from "../gear/SKLogger";
|
||
import { MsgCode } from "../role/EEnum";
|
||
|
||
export default class RelationMgr {
|
||
static shared = new RelationMgr();
|
||
localRelationId: number;
|
||
relationsList: any;
|
||
relationDBTimer: any;
|
||
|
||
constructor() {
|
||
this.localRelationId = 0; //用于关系在未入库时标识用
|
||
this.relationsList = [];
|
||
}
|
||
|
||
init() {
|
||
DB.queryAllRelations((errorcode: any, list: any) => {
|
||
if (errorcode == MsgCode.SUCCESS) {
|
||
for (let rItem of list) {
|
||
let relation = new Relation(this);
|
||
relation.relationId = rItem.relationId;
|
||
try {
|
||
relation.members = SKDataUtil.jsonBy(rItem.members);
|
||
} catch (error) {
|
||
SKLogger.warn(`${relation.relationId}${error}`);
|
||
continue;
|
||
}
|
||
relation.members.forEach((e: any) => {
|
||
relation.memberIds.push(e.playerid);
|
||
});
|
||
relation.createTime = rItem.createTime;
|
||
relation.relationType = rItem.relationType;
|
||
relation.relationName = rItem.relationName;
|
||
relation.status = 1;
|
||
this.relationsList.push(relation);//[rItem.relationId] = relation;
|
||
}
|
||
}
|
||
});
|
||
|
||
DB.getRelationMaxId((errorcode: any, relationId: any) => {
|
||
if (errorcode == MsgCode.SUCCESS) {
|
||
this.localRelationId = relationId;
|
||
if (this.relationDBTimer != null) {
|
||
clearInterval(this.relationDBTimer);
|
||
this.relationDBTimer = null;
|
||
}
|
||
}
|
||
});
|
||
this.relationDBTimer = setInterval(() => {
|
||
DB.getRelationMaxId();
|
||
}, 60 * 1000);
|
||
|
||
}
|
||
|
||
//关系群内操作
|
||
doRelations() {
|
||
}
|
||
|
||
getRelationByMembers(data: any) {
|
||
}
|
||
|
||
applyRelation(player: any, data: any) {
|
||
let checkRes = this.checkRelation(player, data.relationType, data.relationName, data.members);
|
||
if (checkRes == 0) {
|
||
let relation = new Relation(this);
|
||
this.localRelationId = ++this.localRelationId;
|
||
relation.applyRelation(player, this.localRelationId, data.members, data.relationName, data.relationType, 1);
|
||
this.relationsList.push(relation);
|
||
} else {
|
||
player.send('s2c_relation_apply_res', {
|
||
ecode: MsgCode.FAILED,
|
||
errorMsg: checkRes + ''
|
||
});
|
||
}
|
||
}
|
||
|
||
addRelationMember(player: any, data: any) {
|
||
let checkRes = this.checkRelation(player, data.relationType, data.relationName, data.members, data.relationId, 2);
|
||
if (checkRes == 0) {
|
||
let relation = this.relationsList.find((e: any) => {
|
||
return e.relationId = data.relationId;
|
||
})
|
||
if (relation) {
|
||
relation.applyRelation(player, relation.relationId, data.members, relation.relationName, relation.relationType, 2);
|
||
}
|
||
} else {
|
||
player.send('s2c_relation_apply_res', {
|
||
ecode: MsgCode.FAILED,
|
||
errorMsg: checkRes + ''
|
||
});
|
||
}
|
||
}
|
||
/*
|
||
* operateType: 1,新建关系 2,新人加入
|
||
* return 0,成功,1,重名 2,重复创建相同关系 3,人数超过限制 4,成员超过关系人数限制
|
||
*/
|
||
checkRelation(player: any, relation_Type: any, relationName: string = '', members: any = [], relationId: number = -1, operateType: number = 1) {
|
||
if (operateType == 1 && relationName != '') {
|
||
//如果是新关系,需要判断是否已经重名
|
||
let relationIndex = this.relationsList.findIndex((e: any) => {
|
||
return e.relationName == relationName && e.doShow();
|
||
})
|
||
if (relationIndex != -1) {
|
||
//已经有相同的名字了
|
||
return 1;
|
||
}
|
||
}
|
||
//判断是否是重复创建
|
||
let reCreate = this.relationsList.some((e: any) => {
|
||
return e.memberIds.sort().toString() == members.sort().toString();
|
||
});
|
||
|
||
if (reCreate)
|
||
return 2;
|
||
|
||
//判断人数是否超过限制
|
||
if (members.length > GameUtil.relationTypeMembersCount[relation_Type]) {
|
||
//人数超过上限
|
||
return 3;
|
||
}
|
||
|
||
//判断成员已拥有的结拜关系数量
|
||
let checkMaxJoin = members.some((e: any) => {
|
||
let broCount = 0;
|
||
for (var i = 0; i < this.relationsList.length; i++) {
|
||
let relation = this.relationsList[i];
|
||
if (relation.relationId == relationId && relation.doShow()) {
|
||
//已经加入过该关系
|
||
return false;
|
||
} else if (relation_Type == GameUtil.relationType.Brother && relation.hasMember(e) && relation.relationType == GameUtil.relationType.Brother && relation.doShow()) {
|
||
broCount = ++broCount;
|
||
}
|
||
}
|
||
|
||
if (broCount >= 3)
|
||
return true;
|
||
return false;
|
||
|
||
})
|
||
|
||
if (checkMaxJoin)
|
||
return 4; //每人最多同时拥有三个结拜关系
|
||
|
||
//判断是否在线
|
||
members.forEach((e: any): number => {
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(e.playerid);
|
||
if (!player) {
|
||
return 5; //所有成员必须在线
|
||
}
|
||
return 0;
|
||
});
|
||
|
||
//判断成员身上携带银两数
|
||
let lessMoney = members.some((e: any): boolean => {
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(e.playerid);
|
||
if (player) {
|
||
let money = player.GetMoney(0);
|
||
if (money < GameUtil.brotherMoney)
|
||
return true
|
||
}
|
||
return false;
|
||
})
|
||
if (lessMoney) {
|
||
return 6;
|
||
}
|
||
return 0;
|
||
|
||
}
|
||
|
||
confirmRelation(player: any, data: any) {
|
||
let relations = this.relationsList.filter((e: any): boolean => {
|
||
if (e.relationId == data.relationId)
|
||
return true;
|
||
return false;
|
||
});
|
||
|
||
let relation = relations[0];
|
||
relation.confirmRelationApply(player, data.agree);
|
||
}
|
||
|
||
getRelationListByRoleId(player: any, data: any) {
|
||
let relations = this.relationsList.filter((e: any): boolean => {
|
||
if (e.members.some((e: any) => {
|
||
return e.playerid == data.roleId;
|
||
})) {
|
||
return e.relationType == data.relationType && e.doShow();
|
||
}
|
||
return false;
|
||
|
||
});
|
||
let jsonValue = [];
|
||
for (let i = 0; i < relations.length; i++) {
|
||
let relation = relations[i];
|
||
let item = { name: relation.relationName, createTime: relation.createTime, members: SKDataUtil.toJson(relation.members,"{}"), relationType: relation.relationType, relationId: relation.relationId };
|
||
jsonValue.push(item);
|
||
}
|
||
let str = SKDataUtil.toJson(jsonValue,"[]");
|
||
player.send('s2c_relation_List', {
|
||
ecode: MsgCode.SUCCESS,
|
||
relationList: str,
|
||
operationType: data.operationType
|
||
});
|
||
}
|
||
|
||
leaveRelation(player: any, data: any) {
|
||
let relation = this.relationsList.find((e: any) => {
|
||
if (e.members.some((e: any) => {
|
||
return e.playerid == data.roleId;
|
||
})) {
|
||
return e.relationId == data.relationId;
|
||
}
|
||
return false;
|
||
});
|
||
if (relation) {
|
||
relation.leaveRelation(data);
|
||
}
|
||
}
|
||
|
||
deleteRelation(relation: any, relationList: any) {
|
||
let m_index = -1;
|
||
let relationDel = relationList.find((e: any, index: any) => {
|
||
if (e.relationId == relation.relationId)
|
||
m_index = index;
|
||
return true;
|
||
});
|
||
|
||
if (relationDel && m_index != -1) {
|
||
relationList.splice(m_index, 1);
|
||
relationDel = null;
|
||
}
|
||
}
|
||
|
||
|
||
deleteTempRelationByPlayer(roleid: any) {
|
||
let tempRelationList: any = [];
|
||
this.relationsList.forEach((e: any, index: any): boolean => {
|
||
let r = false;
|
||
if (e.members.some((e: any): boolean => {
|
||
return e.playerid == roleid;
|
||
})) {
|
||
r = (e.status == -1 ? true : false);
|
||
if (r) {
|
||
let relation = { relation: e, index: index };
|
||
tempRelationList.push(relation);
|
||
}
|
||
return r;
|
||
} else {
|
||
return r;
|
||
}
|
||
});
|
||
|
||
if (tempRelationList.length > 0) {
|
||
tempRelationList.forEach((e: any) => {
|
||
e.relation.members.every((t: any) => {
|
||
let p = PlayerMgr.shared.getPlayerByRoleId(t.playerid);
|
||
if (p) {
|
||
p.send('s2c_relation_reject', {
|
||
rejectRoleId: roleid,
|
||
relationId: e.relation.relationId
|
||
});
|
||
}
|
||
return true;
|
||
});
|
||
|
||
this.relationsList.splice(e.index, 1);
|
||
e.relation = null;
|
||
});
|
||
}
|
||
}
|
||
|
||
rejectRelation(player: any, data: any) {
|
||
|
||
let m_index = -1;
|
||
let relationDel = this.relationsList.find((e: any, index: any): boolean => {
|
||
if (e.relationId == data.relationId) {
|
||
m_index = index;
|
||
return true;
|
||
}
|
||
return false;
|
||
});
|
||
|
||
if (relationDel) {
|
||
/*
|
||
relationDel.members.array.forEach(e =>{
|
||
let p = PlayerMgr.shared.getPlayerByRoleId(e.playerid);
|
||
if(p){
|
||
p.send('s2c_relation_reject',{
|
||
rejectRoleId: data.roldId,
|
||
relationId:relationDel.relationId
|
||
});
|
||
}
|
||
|
||
if(relationDel.newMembersIds.length > 0){
|
||
|
||
}
|
||
});
|
||
|
||
*/
|
||
let memberList = relationDel.members;
|
||
for (let i = memberList.length - 1; i >= 0; i--) {
|
||
let item = memberList[i];
|
||
let p = PlayerMgr.shared.getPlayerByRoleId(item.playerid);
|
||
if (p) {
|
||
p.send('s2c_relation_reject', {
|
||
rejectRoleId: data.roldId,
|
||
relationId: relationDel.relationId
|
||
});
|
||
}
|
||
|
||
//删除新加的用户
|
||
if (relationDel.newMembersIds.length > 0) {
|
||
let index = relationDel.newMembersIds.indexOf(item.playerid);
|
||
if (index != -1) {
|
||
memberList.splice(i, 1);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (relationDel.newMembersIds.length > 0) {
|
||
let memberIds = relationDel.memberIds;
|
||
for (var i = memberIds.length - 1; i >= 0; i--) {
|
||
|
||
//删除新加的用户
|
||
if (relationDel.newMembersIds.length > 0) {
|
||
let index = relationDel.newMembersIds.indexOf(memberIds[i]);
|
||
if (index != -1) {
|
||
memberIds.splice(index, 1);
|
||
}
|
||
}
|
||
}
|
||
|
||
relationDel.newMembersIds = [];
|
||
|
||
}
|
||
|
||
if (relationDel.status == -1) {
|
||
this.relationsList.splice(m_index, 1);
|
||
relationDel = null;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
update(dt: number) {
|
||
if (dt % (1000 * 60) == 0) {
|
||
this.saveData();
|
||
}
|
||
}
|
||
|
||
saveData() {
|
||
let dbList = this.relationsList.filter((e: any) => {
|
||
return e.doDB();
|
||
});
|
||
|
||
dbList.forEach((e: any) => {
|
||
e.saveData();
|
||
});
|
||
}
|
||
|
||
joinRelation(relationId: any, player: any) {
|
||
}
|
||
|
||
}
|