xy-server/game/bang/BangMgr.ts

495 lines
16 KiB
TypeScript
Raw Normal View History

2025-04-23 09:34:08 +08:00
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;
}
}