495 lines
16 KiB
TypeScript
495 lines
16 KiB
TypeScript
|
import Bang from "./Bang";
|
|||
|
import PlayerMgr from "../object/PlayerMgr";
|
|||
|
import DB from "../utils/DB";
|
|||
|
import PaiHangMgr from "../core/PaiHangMgr";
|
|||
|
import Launch from "../core/Launch";
|
|||
|
import GameUtil from "../core/GameUtil";
|
|||
|
import SKLogger from "../gear/SKLogger";
|
|||
|
import { MsgCode } from "../role/EEnum";
|
|||
|
import Player from "../object/Player";
|
|||
|
import GTimer from "../common/GTimer";
|
|||
|
import SKDataUtil from "../gear/SKDataUtil";
|
|||
|
|
|||
|
export default class BangMgr {
|
|||
|
static shared = new BangMgr();
|
|||
|
bangList: any;
|
|||
|
createList: any;
|
|||
|
biddingList: any[];
|
|||
|
allbid: number;
|
|||
|
loadComplete: any;
|
|||
|
bangDBTimer: any;
|
|||
|
|
|||
|
constructor() {
|
|||
|
this.bangList = {};
|
|||
|
this.createList = {};
|
|||
|
this.biddingList = [];
|
|||
|
this.allbid = 0;
|
|||
|
this.loadComplete = {
|
|||
|
brole: false,
|
|||
|
}
|
|||
|
}
|
|||
|
// 全部存档
|
|||
|
static saveAll(callback:(msg:string)=>void){
|
|||
|
this.shared.saveAll(callback);
|
|||
|
}
|
|||
|
|
|||
|
launch() {
|
|||
|
let self = this;
|
|||
|
DB.getBangList((code: any, list: any) => {
|
|||
|
if (code == MsgCode.SUCCESS) {
|
|||
|
for (let info of list) {
|
|||
|
let bang = new Bang();
|
|||
|
bang.id = info.bangid;
|
|||
|
bang.name = info.name;
|
|||
|
bang.masterid = info.masterid;
|
|||
|
bang.mastername = info.mastername;
|
|||
|
bang.bidding = info.bidding;
|
|||
|
bang.createtime = info.createtime;
|
|||
|
bang.aim = info.aim;
|
|||
|
bang.notice = info.notice;
|
|||
|
bang.banglevel = info.banglevel;
|
|||
|
bang.bangexp = info.bangexp;
|
|||
|
self.bangList[info.bangid] = bang;
|
|||
|
}
|
|||
|
if (list.length > 0) {
|
|||
|
self.checkBangRoles();
|
|||
|
self.initBidding();
|
|||
|
} else {
|
|||
|
self.initComplete();
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
checkBangRoles() {
|
|||
|
DB.getBangRoles((errorcode: any, list: any) => {
|
|||
|
if (errorcode == MsgCode.SUCCESS) {
|
|||
|
for (const bid in list) {
|
|||
|
if (list.hasOwnProperty(bid)) {
|
|||
|
const memberlist = list[bid];
|
|||
|
let bang: Bang = this.bangList[bid];
|
|||
|
if (bang) {
|
|||
|
for (const info of memberlist) {
|
|||
|
bang.rolelist.push({
|
|||
|
roleid: info.roleid,
|
|||
|
name: info.name,
|
|||
|
resid: info.resid,
|
|||
|
relive: info.relive,
|
|||
|
level: info.level,
|
|||
|
race: info.race,
|
|||
|
sex: info.sex,
|
|||
|
bangpost: info.bang_post,
|
|||
|
jointime: info.join_time,
|
|||
|
weekbangbtl: info.week_bang_btl,
|
|||
|
thisbangbtl: info.this_bang_btl,
|
|||
|
weekectype: info.week_ectype,
|
|||
|
daytask: info.day_task,
|
|||
|
ofudalevel: info.ofuda_level
|
|||
|
});
|
|||
|
}
|
|||
|
bang.isinit = true;
|
|||
|
} else {
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
for (const bid in this.bangList) {
|
|||
|
if (this.bangList.hasOwnProperty(bid)) {
|
|||
|
const bang: Bang = this.bangList[bid];
|
|||
|
if (bang.isinit == false) {
|
|||
|
this.delBang(bid);
|
|||
|
SKLogger.debug(`帮派人数为0,帮派[${bid}]删除`);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
this.complete('brole');
|
|||
|
}
|
|||
|
list = null;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
complete(key: any) {
|
|||
|
this.loadComplete[key] = true;
|
|||
|
if (this.loadComplete.brole) {
|
|||
|
this.initComplete()
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
onNewDay() {
|
|||
|
}
|
|||
|
|
|||
|
makeBangId() {
|
|||
|
// server id + 年(2019 = 0) + 月 + 日 + 自增数0~999
|
|||
|
let sid = GameUtil.serverId % 1000 + 1;
|
|||
|
let nowdate = GTimer.getCurDate();
|
|||
|
// 1111111111
|
|||
|
// 11 0 05 10 000
|
|||
|
let year = nowdate.getFullYear() - 2019;
|
|||
|
let month = nowdate.getMonth() + 1;
|
|||
|
let smonth = "" + month;
|
|||
|
if (month < 10) {
|
|||
|
smonth = '0' + month;
|
|||
|
}
|
|||
|
let day = nowdate.getDate();
|
|||
|
let sday = "" + day;
|
|||
|
if (day < 10) {
|
|||
|
sday = '0' + day;
|
|||
|
}
|
|||
|
let mbangid = '' + sid + year + smonth + sday + '000';
|
|||
|
let bid = parseInt(mbangid);
|
|||
|
return bid;
|
|||
|
}
|
|||
|
|
|||
|
initComplete() {
|
|||
|
SKLogger.info("帮派模块加载完毕!");
|
|||
|
PaiHangMgr.shared.initBangRank();
|
|||
|
Launch.shared.complete("BangMgr");
|
|||
|
}
|
|||
|
// 创建帮派
|
|||
|
createBang(player: Player, createdata: any) {
|
|||
|
let cost = GameUtil.ChildBangCost;
|
|||
|
if (player.bangid != 0) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: '请先退出帮派'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
let checkname = GameUtil.checkLimitWord(createdata.name);
|
|||
|
if (!checkname) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: '帮派已经存在,请换个名字'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
let b = this.getBangByName(createdata.name);
|
|||
|
if (b) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: '帮派已经存在,请换个名字'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
if (this.createList[player.roleid] != null) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Object.keys(this.bangList).length >= GameUtil.limitChildBangCount) {
|
|||
|
player.send_notice('创建帮派已上限');
|
|||
|
return;
|
|||
|
}
|
|||
|
let strErr = player.CostFee(1, cost, '创建帮派');
|
|||
|
if (strErr != '') {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: strErr
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
this.createList[player.roleid] = 1;
|
|||
|
let bang = new Bang();
|
|||
|
bang.name = createdata.name;
|
|||
|
bang.aim = createdata.aim;
|
|||
|
bang.masterid = player.roleid;
|
|||
|
bang.mastername = createdata.mastername;
|
|||
|
bang.createtime = new Date().format("yyyy-MM-dd hh:mm:ss");
|
|||
|
bang.banglevel = 1;
|
|||
|
bang.bangexp = 10000;
|
|||
|
bang.rolelist = [];
|
|||
|
bang.id = GameUtil.nextId();
|
|||
|
createdata.bangid = bang.id;
|
|||
|
createdata.banglevel = bang.banglevel;
|
|||
|
createdata.bangexp = bang.bangexp;
|
|||
|
this.bangList[bang.id] = bang;
|
|||
|
delete this.createList[player.roleid];
|
|||
|
player.bangid = bang.id;
|
|||
|
player.bangname = bang.name;
|
|||
|
player.bangpost = GameUtil.bangPost.BangZhu;
|
|||
|
bang.addMember(player);
|
|||
|
player.addTitle(GameUtil.titleType.CommonTitle, GameUtil.titleBangType.BangZhu);
|
|||
|
player.getTaskMgr().checkAndInceptTask();
|
|||
|
player.getTaskMgr().updateTaskStateToClient();
|
|||
|
this.playerGetBangInfo(player);
|
|||
|
DB.createBang(createdata, (ret: any, bangid: any) => {
|
|||
|
if (ret == MsgCode.SUCCESS) {
|
|||
|
SKLogger.debug(`创建帮派[${bang.name}]成功`);
|
|||
|
} else {
|
|||
|
delete this.createList[player.roleid];
|
|||
|
SKLogger.debug('创建帮派[${bang.name}]失败');
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
getBangList() {
|
|||
|
let templist = [];
|
|||
|
let allbid = this.allbid;
|
|||
|
for (let index = 0; index < this.biddingList.length; index++) {
|
|||
|
if (templist.length >= 10) {
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
const info = this.biddingList[index];
|
|||
|
if (index < 3) {
|
|||
|
let bang: Bang = this.getBang(info.bangid);
|
|||
|
if (bang) {
|
|||
|
templist.push(bang.toObj());
|
|||
|
}
|
|||
|
} else {
|
|||
|
let r = GameUtil.random(0, allbid);
|
|||
|
for (let k = index; k < this.biddingList.length; k++) {
|
|||
|
const t = this.biddingList[k];
|
|||
|
r -= t.bidding;
|
|||
|
if (r <= 0) {
|
|||
|
let bang: Bang = this.getBang(t.bangid);
|
|||
|
if (bang) {
|
|||
|
templist.push(bang.toObj());
|
|||
|
allbid -= t.bidding;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
let keylist = Object.keys(this.bangList);
|
|||
|
for (let i = templist.length; i < 30; i++) {
|
|||
|
let r = GameUtil.random(0, keylist.length - 1);
|
|||
|
let bang: Bang = this.bangList[keylist[r]];
|
|||
|
if (bang) {
|
|||
|
templist.push(bang.toObj());
|
|||
|
keylist.splice(r, 1);
|
|||
|
}
|
|||
|
}
|
|||
|
let obj: any = {};
|
|||
|
templist = templist.reduce(function (item, next) {
|
|||
|
obj[next.bangid] ? '' : obj[next.bangid] = true && item.push(next);
|
|||
|
return item;
|
|||
|
}, []);
|
|||
|
|
|||
|
return templist;
|
|||
|
}
|
|||
|
|
|||
|
getBang(bangid: any): Bang {
|
|||
|
return this.bangList[bangid];
|
|||
|
}
|
|||
|
|
|||
|
getBangByMasterid(masterid: any): Bang {
|
|||
|
for (const key in this.bangList) {
|
|||
|
if (this.bangList.hasOwnProperty(key)) {
|
|||
|
let bang: Bang = this.bangList[key];
|
|||
|
if (bang.masterid == masterid) {
|
|||
|
return bang;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
getBangByName(name: any) {
|
|||
|
for (const key in this.bangList) {
|
|||
|
if (this.bangList.hasOwnProperty(key)) {
|
|||
|
let bang: Bang = this.bangList[key];
|
|||
|
if (bang.name == name) {
|
|||
|
return bang;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
playerGetBangInfo(player: any) {
|
|||
|
let bang: Bang = this.getBang(player.bangid);
|
|||
|
if (bang) {
|
|||
|
player.send('s2c_getbanginfo', bang.getBangInfo());
|
|||
|
} else {
|
|||
|
player.send('s2c_getbanglist', { list: this.getBangList() });
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
searchBang(info: any) {
|
|||
|
let templist = [];
|
|||
|
for (const key in this.bangList) {
|
|||
|
if (this.bangList.hasOwnProperty(key)) {
|
|||
|
let bang: Bang = this.bangList[key];
|
|||
|
if (bang.name.indexOf(info.data) > -1 || bang.id == info.data) {
|
|||
|
templist.push(bang.toObj());
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return templist;
|
|||
|
}
|
|||
|
|
|||
|
joinBang(roldid: any, bangid: any) {
|
|||
|
let bang: Bang = this.getBang(bangid);
|
|||
|
if (bang == null || bang.getMemberNum() >= 1000) {
|
|||
|
return false; //帮派不存在或者帮派满员
|
|||
|
}
|
|||
|
|
|||
|
let player = PlayerMgr.shared.getPlayerByRoleId(roldid);
|
|||
|
if (player) {
|
|||
|
player.bangid = bangid;
|
|||
|
player.bangname = bang.name;
|
|||
|
player.bangpost = GameUtil.bangPost.BangZhong;
|
|||
|
player.addTitle(GameUtil.titleType.CommonTitle, GameUtil.titleBangType.BangZhong);
|
|||
|
bang.addMember(player);
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
// 退出帮派
|
|||
|
leaveBang(leaveInfo: any): any {
|
|||
|
let bang: Bang = this.getBang(leaveInfo.bangid);
|
|||
|
if (bang == null) {
|
|||
|
SKLogger.warn(`帮派[${leaveInfo.bangid}不存在`);
|
|||
|
return false;
|
|||
|
}
|
|||
|
return bang.leave(leaveInfo.roleid);
|
|||
|
}
|
|||
|
// 删除帮派
|
|||
|
delBang(bangid: any) {
|
|||
|
let bang = this.getBang(bangid);
|
|||
|
if (bang == null) {
|
|||
|
SKLogger.warn(`帮派[${bangid}不存在`);
|
|||
|
return; //帮派不存在
|
|||
|
}
|
|||
|
DB.deleteBang(bang.id);
|
|||
|
delete this.bangList[bangid];
|
|||
|
this.initBidding();
|
|||
|
}
|
|||
|
|
|||
|
disbandBang(data: any) {
|
|||
|
let bang: Bang = this.getBang(data.bangid);
|
|||
|
if (bang == null) {
|
|||
|
SKLogger.warn(`帮派[${data.bangid}不存在`);
|
|||
|
return false; //帮派不存在
|
|||
|
}
|
|||
|
if (data.roleid == bang.masterid) {
|
|||
|
let player = PlayerMgr.shared.getPlayerByRoleId(bang.masterid);
|
|||
|
SKLogger.debug(`玩家[${player.name}(${player.roleid})]解散了帮派[${bang.name}(${bang.id})]`);
|
|||
|
let list = bang.rolelist;
|
|||
|
DB.deleteBang(bang.id);
|
|||
|
delete this.bangList[data.bangid];
|
|||
|
for (let index = 0; index < list.length; index++) {
|
|||
|
const role = list[index];
|
|||
|
let player = PlayerMgr.shared.getPlayerByRoleId(role.roleid);
|
|||
|
if (player != null) {
|
|||
|
player.bangid = 0;
|
|||
|
player.bangname = '';
|
|||
|
player.bangpost = 0;
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: '帮派已解散,请重新加入其它帮派!'
|
|||
|
});
|
|||
|
player.send('s2c_getbanglist', {
|
|||
|
list: this.getBangList()
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
this.initBidding();
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
// 全部存档
|
|||
|
saveAll(callback: (msg:string) => void) {
|
|||
|
let total = Object.keys(this.bangList).length;
|
|||
|
if (total < 1) {
|
|||
|
let msg=`帮派存档:数量少于1个无需存档!`;
|
|||
|
callback(msg);
|
|||
|
return;
|
|||
|
}
|
|||
|
let saved: number = 1;
|
|||
|
let failed:number = 0;
|
|||
|
for (let key in this.bangList) {
|
|||
|
let bang: Bang = this.bangList[key];
|
|||
|
DB.updateBang({
|
|||
|
bangid: bang.id,
|
|||
|
rolenum: bang.rolelist.length
|
|||
|
}, (code:MsgCode) => {
|
|||
|
if(code==MsgCode.FAILED){
|
|||
|
failed++;
|
|||
|
}
|
|||
|
if (saved >= total) {
|
|||
|
let msg=`帮派存档:[失败:${failed}/总数:${total}]存档完成!`
|
|||
|
callback(msg);
|
|||
|
}
|
|||
|
});
|
|||
|
saved++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
requestBang(player: any, bangid: any, requestInfo?: any) {
|
|||
|
let bang: Bang = this.getBang(bangid);
|
|||
|
if (bang == null) {
|
|||
|
SKLogger.warn(`帮派[${bangid}不存在`);
|
|||
|
return false;
|
|||
|
}
|
|||
|
let membernum = (bang.banglevel + 1) * 500;
|
|||
|
if(membernum > 4500){
|
|||
|
membernum = 4500
|
|||
|
}
|
|||
|
if (bang.getMemberNum() >= membernum) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: '帮派满员,请选择其他帮派!'
|
|||
|
});
|
|||
|
return false; //帮派不存在或者帮派满员
|
|||
|
}
|
|||
|
if (bang.getRequestnum() >= 100) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: '申请人数过多,请选择其他帮派!'
|
|||
|
});
|
|||
|
return false; //申请入帮人数过多
|
|||
|
}
|
|||
|
for (const info of bang.requestlist) {
|
|||
|
if (info.roleid == player.roleid) {
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: '已经申请过这个帮派,等待帮主确认!'
|
|||
|
});
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bang.addRequest(player);
|
|||
|
|
|||
|
player.send('s2c_notice', {
|
|||
|
strRichText: '申请成功,等待帮主确认!'
|
|||
|
});
|
|||
|
|
|||
|
let master = PlayerMgr.shared.getPlayerByRoleId(bang.masterid);
|
|||
|
if (master) {
|
|||
|
master.send('s2c_join_bang');
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
initBidding() {
|
|||
|
this.biddingList = [];
|
|||
|
for (const bangid in this.bangList) {
|
|||
|
if (this.bangList.hasOwnProperty(bangid)) {
|
|||
|
const bang: Bang = this.bangList[bangid];
|
|||
|
if (bang.bidding > 0) {
|
|||
|
this.biddingList.push({
|
|||
|
bangid: bang.id,
|
|||
|
bidding: bang.bidding,
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
this.biddingList.sort((a, b) => {
|
|||
|
return b.bidding - a.bidding;
|
|||
|
});
|
|||
|
let allbid = 0;
|
|||
|
for (let i = 0; i < this.biddingList.length; i++) {
|
|||
|
const info = this.biddingList[i];
|
|||
|
if (i > 3) {
|
|||
|
allbid += info.bidding;
|
|||
|
}
|
|||
|
}
|
|||
|
for (let i = 0; i < this.biddingList.length; i++) {
|
|||
|
const info = this.biddingList[i];
|
|||
|
let bang = this.getBang(info.bangid);
|
|||
|
if (bang == null) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (i < 3) {
|
|||
|
bang.weight = 100;
|
|||
|
} else {
|
|||
|
bang.weight = Math.ceil(bang.bidding / allbid * 100);
|
|||
|
}
|
|||
|
}
|
|||
|
this.allbid = allbid;
|
|||
|
}
|
|||
|
}
|