军团活动:诸侯混战城池状态

This commit is contained in:
luying
2021-03-29 21:05:06 +08:00
parent dd2480181b
commit 85f886c3c8
18 changed files with 204 additions and 53 deletions
@@ -76,7 +76,7 @@ export class CityActivityHandler {
}
const dbCities = await GuildActivityCityModel.getAllCities(serverId);
let cityStatus = pubGetCityStatus(guildCode, cityId, dicCity.preCity, dbCities);
let cityStatus = pubGetCityStatus(guildCode, cityId, dicCity, dbCities);
if(cityStatus == CITY_STATUS.DECLARED) {
obj.pushGuild(guildCode, serverId, cityId);
}
@@ -185,7 +185,7 @@ export class CityActivityHandler {
let guildScore = await getRankScore(getCityKeyName(REDIS_KEY.CITY_ACTIVITY, cityId), serverId, guildCode);
const dbCities = await GuildActivityCityModel.getAllCities(serverId);
let cityStatus = pubGetCityStatus(guildCode, cityId, dicCity.preCity, dbCities);
let cityStatus = pubGetCityStatus(guildCode, cityId, dicCity, dbCities);
// 前一天中位数战力
let medianCe = await getMedianCe(serverId);
@@ -13,8 +13,8 @@ import { REDIS_KEY } from "../../../consts";
import { addActive } from "../../../services/guildService";
import { gameData } from "../../../pubUtils/data";
import { getGuildChannelSid } from "../../../services/chatService";
import { guildActivityStart, gateActivityEnd, cityActivityEnd } from "../../../services/timeTaskService";
import { UserGuildModel } from "../../../db/UserGuild";
import { GuildActivityCityModel } from "../../../db/GuildActivityCity";
export default function (app: Application) {
return new GateActivityHandler(app);
@@ -306,6 +306,25 @@ export class GateActivityHandler {
return resResult(STATUS.GUILD_ACTIVITY_IS_OPEN)
}
// !! 注意,这条函数会改变内存中的字典表,仅用于测试中使用
let now = new Date();
let guildServers = pinus.app.getServersByType('guild');
for(let server of guildServers) {
pinus.app.rpc.guild.guildActivityRemote.updateGuildActivityData.toServer(server.id, aid, true);
}
return resResult(STATUS.SUCCESS);
}
// ! 测试接口
async debugSetDay(msg: { week: number }, session: BackendSession) {
let guildServers = pinus.app.getServersByType('guild');
for(let server of guildServers) {
pinus.app.rpc.guild.guildActivityRemote.setDay.toServer(server.id, msg.week);
}
if(msg.week <= 2) {
await GuildActivityCityModel.deleteMany({});
}
return resResult(STATUS.SUCCESS);
}
@@ -319,6 +338,13 @@ export class GateActivityHandler {
} else if (aid == GUILD_ACTIVITY_TYPE.RACE_ACTIVITY) {
await pinus.app.rpc.systimer.systimerRemote.raceActivityEnd.toServer('systimer-server-1');
}
// !! 注意,这条函数会改变内存中的字典表,仅用于测试中使用
let now = new Date();
let guildServers = pinus.app.getServersByType('guild');
for(let server of guildServers) {
pinus.app.rpc.guild.guildActivityRemote.updateGuildActivityData.toServer(server.id, aid, false);
}
return resResult(STATUS.SUCCESS);
}
@@ -70,7 +70,7 @@ export class RaceActivityHandler {
}
let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid);
let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid, obj.getEvents(guildCode, 0));
if(!guildActivityRec) return resResult(STATUS.INTERNAL_ERR);
let { code: sourceCode } = guildActivityRec;
@@ -124,14 +124,24 @@ export class RaceActivityHandler {
}
// 结束挑战
async useItem(msg: { id: number, toGuild: string }, session: BackendSession) {
// 使用道具
async useItem(msg: { id: number, count: number, toGuild: string }, session: BackendSession) {
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let guildCode = session.get('guildCode');
let serverId = session.get('serverId');
let sid = session.get('sid');
let {id, count, toGuild} = msg;
let obj = getRaceActivityObj();
let event = await obj.useItem(roleId, sid, guildCode, toGuild, id, count);
if(!event) return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
return resResult(STATUS.SUCCESS);
await GuildActivityRecordModel.pushEvent(guildCode, event);
return resResult(STATUS.SUCCESS, {
timestamp: Date.now(),
event: obj.getEvents(guildCode, 0)
});
}
// 结束挑战
@@ -1,5 +1,7 @@
import { Application, ChannelService } from 'pinus';
import { sendAllGuildRanks, sendGuildActEndMsg, calWoodenHorseAndSend, sendRaceStartMsg } from '../../../services/guildActivityService';
import { gameData } from '../../../pubUtils/data';
import { setWeek } from '../../../pubUtils/timeUtil';
export default function (app: Application) {
return new GuildActivityRemote(app);
@@ -41,4 +43,30 @@ export class GuildActivityRemote {
async raceActivityStart(serverId: number) {
await sendRaceStartMsg(serverId);
}
/**
* !! 注意,这条函数会改变内存中的字典表,影响甚大,请考虑清楚后使用
*/
async updateGuildActivityData(aid: number, isStart: boolean) {
let guildActivity = gameData.guildActivity;
let cur = guildActivity.get(aid);
if(isStart) {
let now = new Date();
cur.startMinute = now.getMinutes();
cur.startTime = now.getHours();
} else {
let now = new Date(Date.now() - cur.duringTime * 1000);
cur.startMinute = now.getMinutes();
cur.startTime = now.getHours();
}
}
/**
* !! 注意,这条函数会改变内存时间,影响甚大,请考虑清楚后使用
*/
async setDay(week: number) {
setWeek(week);
}
}
@@ -549,12 +549,13 @@ export class EquipHandler {
if (!res)
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
let result = await addItems(roleId, roleName, sid, [{ id: jewel, count: count }]);
if (type == 1)
return resResult(STATUS.SUCCESS, { goods: result });
if (goodInfo.lvLimited >= JEWEL_PUSH_LV) {
pushNormalItemMsg(roleId, roleName, serverId, MSG_SOURCE.JEWEL_COMPOSE, jewel, goodInfo.name);
}
if (type == 1)
return resResult(STATUS.SUCCESS, { goods: result });
return resResult(STATUS.SUCCESS);
}
@@ -20,7 +20,7 @@ import { EquipModel } from "../../../db/Equip";
import { getPlayerMainAttribute } from "../../../services/pvpService";
import { FRIEND } from "../../../pubUtils/dicParam";
import { PlayerDetail, PlayerDetailHero } from "../../../domain/battleField/guild";
import { createPrivateMsg, pushMsgToRole } from "../../../services/chatService";
import { createPrivateMsg, pushMsgToRole, pushPresent } from "../../../services/chatService";
export default function (app: Application) {
@@ -605,9 +605,10 @@ export class FriendHandler {
let roleId: string = session.get('roleId');
let roleName: string = session.get('roleName');
let sid: string = session.get('sid');
let serverId: string = session.get('serverId');
let { roleId: hisRoleId, items } = msg;
let myRelation = await FriendRelationModel.findFriendByRole(roleId, POPULATE_TYPE.NOT);
let myRelation = await FriendRelationModel.findFriendByRole(roleId, POPULATE_TYPE.FRIEND_NAME_ONLY);
let friends = myRelation?myRelation.friends: [];
let curFriend = friends.find(cur => cur.roleId == hisRoleId);
if(!curFriend) return resResult(STATUS.FRIEND_NOT_FOUND);
@@ -636,8 +637,10 @@ export class FriendHandler {
// TODO 日志可以转到log服
await FriendPresentLogModel.createRecord(roleId, hisRoleId, items);
for(let {id, count} of items ) {
const msgData = await createPrivateMsg(roleId, roleName, MSG_TYPE.RICH_TEXT, MSG_SOURCE.ROLE_SEND_TEXT, JSON.stringify({ id, count }), hisRoleId, null);
const msgData = await createPrivateMsg(roleId, roleName, MSG_TYPE.RICH_TEXT, MSG_SOURCE.PRIVATE_SEND_GIFT, JSON.stringify({ id, count }), hisRoleId, null);
await pushMsgToRole(msgData);
let hisRole = <RoleType>curFriend.role;
await pushPresent(roleId, roleName, serverId, hisRole.roleName, id);
}
return resResult(STATUS.SUCCESS, {
@@ -3,7 +3,7 @@ import { RoleModel } from "../db/Role";
import { reduceCe } from "../pubUtils/util";
import { GUILDACTIVITY } from "../pubUtils/dicParam";
import { gameData, getGuildAuctionRewards, getCityActivityRewards } from "../pubUtils/data";
import { getCurHourPoint, getCutDay, nowSeconds } from "../pubUtils/timeUtil";
import { getCurHourPoint, getCurDay, nowSeconds } from "../pubUtils/timeUtil";
import { GUILD_ACTIVITY_STATUS, GET_POINT_WAYS, GUILD_ACTIVITY_TYPE, REDIS_KEY, AUCTION_SOURCE, MAIL_TYPE, CITY_STATUS } from "../consts";
import { Record, UserGuildActivityRecModel } from "../db/UserGuildActivityRec";
import { GateMembersRec, GateActivityObject, CityActivityObject, CityParam, Member, RaceActivityObject, WoodenHorse } from "../domain/battleField/guildActivity";
@@ -18,6 +18,8 @@ import { genAuction } from "./auctionService";
import { sendMail } from "./mailService";
import { getHonourObject } from '../pubUtils/itemUtils';
import { GuildActivityCityType, GuildActivityCityModel } from "../db/GuildActivityCity";
import { DicCityActivity } from "../pubUtils/dictionary/DicCityActivity";
import { open } from "inspector";
let gateActivityObj: GateActivityObject;
let cityActivityObj: CityActivityObject;
@@ -89,7 +91,7 @@ export function getGuildActivityStatus(id: number) {
}
export function getGuildActivityByDic(dicGuildActivity: DicGuildActivity) {
console.log('****',dicGuildActivity.startTime, dicGuildActivity.startMinute)
let startTime = getCurHourPoint(dicGuildActivity.startTime, dicGuildActivity.startMinute);
let countdownTime = getCurHourPoint(dicGuildActivity.countDown);
let { duringTime, openDay } = dicGuildActivity;
@@ -107,7 +109,7 @@ export function getGuildActivityByDic(dicGuildActivity: DicGuildActivity) {
status = GUILD_ACTIVITY_STATUS.END;
}
let day = getCutDay();
let day = getCurDay();
let isOpen = openDay.includes(day);
return {
@@ -302,11 +304,12 @@ export async function sendGuildActEndMsg(aid: number) {
gateActivityObj = new GateActivityObject();
} else if (aid == GUILD_ACTIVITY_TYPE.CITY_ACTIVITY) {
let obj = getCityActivityObj();
let { cities, serverlists} = obj.getAllCities();
let { cities } = obj.getAllCities();
for(let { serverId, cityId } of cities) {
await cityActivitySettleReward(cityId, serverId);
}
// 发完之后再做下周自动宣战
let serverlists = await getAllServers();
for(let serverId of serverlists) {
await autoDeclare(serverId);
}
@@ -479,6 +482,9 @@ async function autoDeclare(serverId: number) {
await GuildActivityCityModel.declare(serverId, dicCity.nextCity, guardGuildCode);
}
}
for(let { cityId } of allCities) {
await GuildActivityCityModel.guard(serverId, cityId, "", "");
}
}
/**
@@ -512,32 +518,35 @@ export function getCities(guildCode: string, dbCities: GuildActivityCityType[])
param.declareCount = curCity.declareCount||0;
}
param.status = getCityStatus(guildCode, cityId, dic.preCity, dbCities);
param.status = getCityStatus(guildCode, cityId, dic, dbCities);
cities.push(param);
}
return cities
}
/**
* 诸侯混战 获取城池状态
* @param guildCode
* @param cityId
* @param preCity
* @param dic
* @param dbCities
*/
export function getCityStatus(guildCode: string, cityId: number, preCity: number[], dbCities: GuildActivityCityType[]) {
export function getCityStatus(guildCode: string, cityId: number, dic: DicCityActivity, dbCities: GuildActivityCityType[]) {
let status = CITY_STATUS.NOT_OPEN;
if(preCity && preCity.length) {
let hasGuardCity = dbCities.find(cur => {
return preCity.includes(cur.cityId) && cur.guardGuildCode == guildCode;
});
if(!!hasGuardCity) {
status = CITY_STATUS.CAN_DECLARE;
}
} else {
status = CITY_STATUS.CAN_DECLARE;
let d = getCurDay(true);
let { week, preCity } = dic;
let activityStatus = getGuildActivityStatus(GUILD_ACTIVITY_TYPE.CITY_ACTIVITY);
if(!activityStatus) {
return CITY_STATUS.NOT_OPEN
}
let dicGuildActivity = gameData.guildActivity.get(GUILD_ACTIVITY_TYPE.CITY_ACTIVITY);
let { openDay } = dicGuildActivity;
let curIndex = openDay.indexOf(week[0]);
let startDay = openDay[curIndex - 1]||0;
let endDay = openDay[openDay.length - 1]||0;
if(d >= startDay && d <= endDay) status = CITY_STATUS.CAN_DECLARE;
let curCity = dbCities.find(cur => cur.cityId == cityId);
if(curCity) {
if(curCity.guardGuildCode == guildCode) {
@@ -546,6 +555,18 @@ export function getCityStatus(guildCode: string, cityId: number, preCity: number
status = CITY_STATUS.DECLARED;
}
}
let hasGuard = false, hasDeclared = false;
for(let { cityId: _cityId, guardGuildCode, declareGuilds } of dbCities) {
let dicCity = gameData.cityActivity.get(_cityId);
if(dicCity.type == dic.type) {
if(guardGuildCode == guildCode) hasGuard = true;
if(declareGuilds.includes(guildCode)) hasDeclared = true;
}
}
if(status == CITY_STATUS.CAN_DECLARE && !hasDeclared && preCity.length > 0) {
status = CITY_STATUS.NOT_OPEN;
}
return status;
}
@@ -40,6 +40,13 @@ export async function pushHeroWakeUp(roleId: string, roleName: string, serverId:
await pushNormalHeroInfoBySource(roleId, roleName, serverId, MSG_SOURCE.HERO_WAKEUP, heroInfo);
}
export async function pushPresent(roleId: string, roleName: string, serverId: number | string, toRoleName: string, id: number) {
const content = JSON.stringify({ roleId, roleName, toRoleName, id });
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.SYS, `${serverId}`, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GROUP_SEND_GIFT, content, null, null);
await pushGroupMsgToRoom(msgData);
}
export async function pushComBtlTeamMsg(teamCode: string, roleId: string, roleName: string, type: number, source: number, content: string, targetRoleId: string, targetMsgCode: string) {
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.TEAM, teamCode, type, source, content, targetRoleId, targetMsgCode);
if (!msgData) return null;