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; } }