xy-server/game/object/Relation.ts
2025-04-23 09:34:08 +08:00

368 lines
13 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import PlayerMgr from "./PlayerMgr";
import GameUtil from "../core/GameUtil";
import DB from "../utils/DB";
import SKDataUtil from "../gear/SKDataUtil";
import SKLogger from "../gear/SKLogger";
import { MsgCode } from "../role/EEnum";
declare global {
interface Date {
format(fmt: any):any;
}
}
Date.prototype.format = function (fmt: any) { //author: meizz
let o:any = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (let k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? String(o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
export default class Relation{
relationId: number;
relationName: string;
members: any[];
memberIds: any[]; //保存成员RoleID用于成员检测
newMembersIds: any[]; //新加入的成员ID
createTime: any;
maxMembersCount: number;
relationType: number;
leader: any;
status: number; //-1待确认0已创建未入库 1正常已入库2修改3删除
relationMgr: any;
constructor(relationMgr: any) {
this.relationId = -1;
this.relationName = '';
this.members = [];
this.memberIds = []; //保存成员RoleID用于成员检测
this.newMembersIds = []; //新加入的成员ID
this.createTime = '';
this.maxMembersCount = 5;
this.relationType = -1;
this.leader = null;
this.status = -1; //-1待确认0已创建未入库 1正常已入库2修改3删除
this.relationMgr = relationMgr;
}
//发起关系申请
applyRelation(player: any, relationId: any, members: any, relationName: any, relationType: any, operateType: number = 1) {
this.relationId = relationId;
this.relationName = relationName;
this.leader = player;
//this.members = members;
this.maxMembersCount = GameUtil.relationTypeMembersCount[relationType];
this.relationType = relationType;
if (operateType == 2) {
this.newMembersIds = this.memberIds.concat(members).filter(function (e, i, arr) {
return arr.indexOf(e) === arr.lastIndexOf(e);
});
}
if (operateType == 1) {
this.status = -1;
this.members = [];
this.memberIds = [];
for (var i = 0; i < members.length; i++) {
let member = PlayerMgr.shared.getPlayerByRoleId(members[i]);
let isLeader = members[i] == player.roleid ? true : false;
this.members.push({ playerid: member.roleid, onlyid: member.onlyid, resid: member.resid, name: member.name, agree: isLeader, isLeader: isLeader, jointime: new Date().format("yyyy-MM-dd hh:mm:ss") });
this.memberIds.push(member.roleid);
}
} else if (operateType == 2) {
this.members.forEach((e:any)=>{
if (!e.isLeader) {
e.agree = false;
} else {
e.agree = true;
}
});
for (var i = 0; i < this.newMembersIds.length; i++) {
let member = PlayerMgr.shared.getPlayerByRoleId(this.newMembersIds[i]);
this.members.push({ playerid: member.roleid, onlyid: member.onlyid, resid: member.resid, name: member.name, agree: false, isLeader: false, jointime: new Date().format("yyyy-MM-dd hh:mm:ss") });
this.memberIds.push(member.roleid);
}
this.status = 2;
}
for (var i = 0; i < members.length; i++) {
let member = PlayerMgr.shared.getPlayerByRoleId(members[i]);
member.send('s2c_relation_apply_info', {
relationType: relationType,
playersInfo: SKDataUtil.toJson(this.members,"[]"),
leaderId: player.roleid,
relationId: this.relationId,
relationName: this.relationName
});
}
player.send('s2c_relation_apply_res', {
ecode: MsgCode.SUCCESS,
errorMsg: '成功发起关系申请'
});
}
//其他玩家对申请关系的操作(同意/拒绝)
confirmRelationApply(player:any, agree:any) {
agree = agree == 1 ? true : false;
this.members.some((e:any)=>{
if (e.playerid == player.roleid) {
e.agree = agree;
}
});
for (const pid in this.members) {
let member = PlayerMgr.shared.getPlayerByRoleId(this.members[pid].playerid);
member.send('s2c_relation_apply_answer', {
playerId: player.roleid,
agree: agree,
relationId: this.relationId
});
}
let res = this.members.every((e:any)=>{
return e.agree;
});
//如果所有人都已经同意
if (res) {
if (this.status == 2) {
this.status = 2
} else {
this.status = 0;
}
for (const pid in this.members) {
let member = PlayerMgr.shared.getPlayerByRoleId(this.members[pid].playerid);
member.send('s2c_relation_created', {
ecode: MsgCode.SUCCESS,
msg: '',
relationType: this.relationType,
members: SKDataUtil.toJson(this.members,'[]'),
});
let titleInfo = this.getTitleInfo();
member.addTitle(titleInfo.titleType, titleInfo.titleId, this.relationName);
member.CostFee(0, GameUtil.brotherMoney, '与他人结拜');
}
this.createTime = new Date();
}
}
getTitleInfo() {
let titleType = GameUtil.titleType.BroTitle;
let titleId = GameUtil.titleBangType.Brother;
if (this.relationType == GameUtil.relationType.Couple) {
titleType = GameUtil.titleType.CoupleTitle;
titleId = GameUtil.titleBangType.Couple;
}
return { titleType: titleType, titleId: titleId };
}
hasMember(playerId:any) {
return this.members.some((e:any)=>{
return e.playerid == playerId;
});
}
//关系群内操作
doRelation() {
}
joinRelations() {
}
//退出关系
leaveRelation(data:any) {
let m_index = -1;
let member = this.members.find((e, index) => {
if (e.playerid == data.roleId) {
m_index = index;
return true;
}
return false;
})
let titleInfo = this.getTitleInfo();
if (member && m_index != -1) {
this.members.every((e:any)=>{
let p = PlayerMgr.shared.getPlayerByRoleId(e.playerid);
if (p) {
p.send('s2c_relation_leave', {
ecode: MsgCode.SUCCESS,
leaveRoleId: member.playerid,
relationId: this.relationId,
titleId: titleInfo.titleId,
relationName: this.relationName
});
}
return true;
});
this.members.splice(m_index, 1);
let index = this.memberIds.indexOf(data.roleId);
if (index != -1)
this.memberIds.splice(index, 1);
//删除相关称谓
let player = PlayerMgr.shared.getPlayerByRoleId(member.playerid);
if (player) {
player.delTitle(titleInfo.titleType, titleInfo.titleId, this.relationName);
player.CostFee(0, GameUtil.brotherMoney, '与他人结拜');
}
this.status = 2;
}
if (this.members.length <= 1) {
this.members.every((e:any)=>{
let player = PlayerMgr.shared.getPlayerByRoleId(e.playerid);
if (player) {
player.send('s2c_relation_destroy', {
ecode: MsgCode.SUCCESS,
relationId: this.relationId,
titleId: titleInfo.titleId
});
player.delTitle(titleInfo.titleType, titleInfo.titleId, this.relationName);
}
return true;
});
this.status = 3;
}
}
destroyRelation() {
}
doShow() {
return this.status == 0 || this.status == 1 || this.status == 2;
}
doDB() {
return this.status == 0 || this.status == 2 || this.status == 3;
}
saveData() {
let that = this;
if (this.status == 0) {
//创建新的关系
let membersData:any = [];
this.members.forEach((e:any)=>{
let m = { playerid: e.playerid, onlyid: e.onlyid, resid: e.resid, name: e.name, isLeader: e.isLeader, jointime: e.jointime };
membersData.push(m);
})
let sqlData = {
relationId: this.relationId,
members: SKDataUtil.toJson(membersData,"[]"),
relationType: this.relationType,
relationName: this.relationName,
status: 0 //status用于数据库标志是否删除与this.status不同
}
DB.createRelation(sqlData, (errorcode:any, relationId:any) => {
if (errorcode == MsgCode.SUCCESS) {
//that.relationId = relationId;
DB.getRelationById(relationId, (errorcode:any, rows:any) => {
if (rows.length > 0) {
let relation = rows[0];
that.createTime = relation.createTime;
}
});
that.status = 1;
SKLogger.debug(that.relationName + `DB关系创建成功`);
} else {
SKLogger.debug(that.relationName + `DB关系创建失败`);
}
});
} else if (this.status == 2) {
//修改关系(成员变更)
let membersData:any = [];
this.members.forEach((e:any)=>{
let m = { playerid: e.playerid, onlyid: e.onlyid, resid: e.resid, name: e.name, isLeader: e.isLeader, jointime: e.jointime };
membersData.push(m);
})
let params = {
relationId: this.relationId,
members: SKDataUtil.toJson(membersData,"[]"),
relationType: this.relationType,
relationName: this.relationName,
status: 0 //status用于数据库标志是否删除与this.status不同
};
DB.updateRelationMembersById(params, (errorcode:any, list:any) => {
if (errorcode == MsgCode.SUCCESS) {
SKLogger.debug(that.relationName + `DB关系成员更新成功`);
that.status = 1;
} else {
SKLogger.debug(that.relationName + `DB关系成员更新失败`);
}
});
} else if (this.status == 3) {
//删除关系
//如果成员退出后,只剩下一个人,则自动解散
let membersData:any = [];
this.members.forEach((e:any)=>{
let m = { playerid: e.playerid, onlyid: e.onlyid, resid: e.resid, name: e.name, isLeader: e.isLeader, jointime: e.jointime };
membersData.push(m);
})
let sqlData = {
relationId: this.relationId,
members: SKDataUtil.toJson(membersData,"[]"),
relationType: this.relationType,
relationName: this.relationName,
status: -1 //status用于数据库标志是否删除与this.status不同
}
DB.deleteRelationById(sqlData, (errorcode:any, list:any) => {
if (errorcode == MsgCode.SUCCESS) {
SKLogger.debug(that.relationName + `DB关系删除成功`);
if (that.relationMgr) {
let delIndex = -1;
let item = that.relationMgr.relationsList.find((e:any, index:any):boolean => {
if (e.relationId == this.relationId) {
delIndex = index;
return true;
}
return false;
})
if (item && delIndex != -1) {
that.relationMgr.relationsList.splice(delIndex, 1);
item = null;
}
}
} else {
SKLogger.debug(that.relationName + `DB关系删除失败`);
}
});
}
}
}