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关系删除失败`);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
} |