xy-server/game/object/RelationMgr.ts

368 lines
12 KiB
TypeScript
Raw Permalink Normal View History

2025-04-23 09:34:08 +08:00
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 01, 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) {
}
}