xy-server/game/object/Relation.ts

368 lines
13 KiB
TypeScript
Raw Normal View History

2025-04-23 09:34:08 +08:00
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关系删除失败`);
}
});
}
}
}