368 lines
13 KiB
TypeScript
368 lines
13 KiB
TypeScript
|
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关系删除失败`);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|