军团活动:添加诸侯奖励结算
This commit is contained in:
@@ -2,23 +2,22 @@ import { ServerlistModel } from "../db/Serverlist";
|
||||
import { RoleModel } from "../db/Role";
|
||||
import { reduceCe } from "../pubUtils/util";
|
||||
import { GUILDACTIVITY } from "../pubUtils/dicParam";
|
||||
import { gameData, getGuildAuctionRewards } from "../pubUtils/data";
|
||||
import { gameData, getGuildAuctionRewards, getCityActivityRewards } from "../pubUtils/data";
|
||||
import { getCurHourPoint, getCutDay, 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 } from "../domain/battleField/guildActivity";
|
||||
import { GateMembersRec, GateActivityObject, CityActivityObject, CityParam, Member } from "../domain/battleField/guildActivity";
|
||||
import { DicGuildActivity } from "../pubUtils/dictionary/DicGuildActivity";
|
||||
import { getUnionRank, getRank, getGuildKeyName, getMyUnionRank, getRankScore, getCityKeyName } from "./redisService";
|
||||
import { GuildModel } from "../db/Guild";
|
||||
import { SimpleGuildRankParam, SimpleRoleRankParam } from "../domain/rank";
|
||||
import { getGuildChannelSid, getWorldChannelSid } from "./chatChannelService";
|
||||
import { getGuildChannelSid, getWorldChannelSid, getCityChannelSid } from "./chatChannelService";
|
||||
import { pinus } from "pinus";
|
||||
import { GuildActivityRecordModel } from "../db/GuildActivityRec";
|
||||
import { uniq } from 'underscore'
|
||||
import { genAuction } from "./auctionService";
|
||||
import { sendMail } from "./mailService";
|
||||
import { getHonourObject } from '../pubUtils/itemUtils';
|
||||
import { GuildActivityCityType } from "../db/GuildActivityCity";
|
||||
import { GuildActivityCityType, GuildActivityCityModel } from "../db/GuildActivityCity";
|
||||
|
||||
let gateActivityObj: GateActivityObject;
|
||||
let cityActivityObj: CityActivityObject;
|
||||
@@ -225,39 +224,65 @@ export async function sendAllGuildRanks(aid: number) {
|
||||
* @param aid 活动类型
|
||||
*/
|
||||
export async function sendGuildActEndMsg(aid: number) {
|
||||
let obj = getGateActivityObj();
|
||||
let guilds = obj.getGuilds();
|
||||
for(let [ serverId, guildCodes ] of guilds) {
|
||||
let chatSid = await getWorldChannelSid(serverId);
|
||||
pinus.app.rpc.chat.chatRemote.sendGuildActivityEnd.toServer(chatSid, serverId);
|
||||
|
||||
if(aid == GUILD_ACTIVITY_TYPE.GATE_ACTIVITY) {
|
||||
if(aid == GUILD_ACTIVITY_TYPE.GATE_ACTIVITY) {
|
||||
let obj = getGateActivityObj();
|
||||
let guilds = obj.getGuilds();
|
||||
for(let [ serverId, guildCodes ] of guilds) {
|
||||
let chatSid = await getWorldChannelSid(serverId);
|
||||
pinus.app.rpc.chat.chatRemote.sendGuildActivityEnd.toServer(chatSid, serverId);
|
||||
|
||||
for(let guildCode of guildCodes) {
|
||||
await gateActivitySettleReward(guildCode, serverId);
|
||||
}
|
||||
}
|
||||
} else if (aid == GUILD_ACTIVITY_TYPE.CITY_ACTIVITY) {
|
||||
let obj = getCityActivityObj();
|
||||
let { cities, serverlists} = obj.getAllCities();
|
||||
for(let { serverId, cityId } of cities) {
|
||||
await cityActivitySettleReward(cityId, serverId);
|
||||
}
|
||||
// 发完之后再做下周自动宣战
|
||||
for(let serverId of serverlists) {
|
||||
await autoDeclare(serverId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 单个军团城门血条破了之后给他发奖励
|
||||
* @param guildCode
|
||||
* @param guildCode 军团code
|
||||
*/
|
||||
export async function sendSingleGuildGateActEndMsg(guildCode: string, serverId: number) {
|
||||
export async function sendSingleGateActEndMsg(guildCode: string, serverId: number) {
|
||||
let chatSid = await getGuildChannelSid(guildCode);
|
||||
pinus.app.rpc.chat.guildRemote.sendGuildActivityEnd.toServer(chatSid, guildCode);
|
||||
await gateActivitySettleReward(guildCode, serverId);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 军团结算奖励
|
||||
* @param guildCode
|
||||
* @param serverId
|
||||
* 单个城池城门血条破了之后给他发奖励
|
||||
* @param guildCode 军团code
|
||||
*/
|
||||
export async function sendSingleCityActEndMsg(cityId: number, serverId: number) {
|
||||
let chatSid = await getCityChannelSid(cityId);
|
||||
let obj = getCityActivityObj();
|
||||
let guildCodes = obj.getGuildsInCity(serverId, cityId);
|
||||
for(let guildCode of guildCodes) {
|
||||
pinus.app.rpc.chat.guildRemote.sendGuildActivityEnd.toServer(chatSid, guildCode);
|
||||
}
|
||||
await cityActivitySettleReward(cityId, serverId);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 结算蛮夷入侵奖励
|
||||
* @param guildCode 军团code
|
||||
* @param serverId 服务器id
|
||||
*/
|
||||
export async function gateActivitySettleReward(guildCode: string, serverId: number) {
|
||||
let obj = getGateActivityObj();
|
||||
let { gateHp, members } = obj.getObj(guildCode, serverId);
|
||||
members = uniq(members, cur => cur.roleId);
|
||||
|
||||
let rank = await getMyUnionRank(REDIS_KEY.GATE_ACTIVITY, serverId, guildCode);
|
||||
let guildScore = await getRankScore(REDIS_KEY.GATE_ACTIVITY, serverId, guildCode);
|
||||
@@ -277,10 +302,10 @@ export async function gateActivitySettleReward(guildCode: string, serverId: numb
|
||||
let memberRankResult = await getRank(getGuildKeyName(REDIS_KEY.USER_GATE_ACTIVITY, guildCode), serverId, '');
|
||||
for(let { rank, roleId, num: myScore } of memberRankResult.ranks) {
|
||||
let honour = dic.honour + myScore * GUILDACTIVITY.GATEACTIVITY_HONOUR_RATIO;
|
||||
let honourObj = getHonourObject(Math.floor(honour));
|
||||
await sendMail(MAIL_TYPE.GUILD_ACTIVITY_REWARD, roleId, '系统', [], [honourObj])
|
||||
|
||||
await UserGuildActivityRecModel.updateInfoByRoleId(roleId, { score: myScore, rank });
|
||||
await updateUserRecAndSendHonour(honour, myScore, rank, roleId, members);
|
||||
}
|
||||
for(let { roleId } of members) { // 只参加了,没有分数的人
|
||||
await updateUserRecAndSendHonour(dic.honour, 0, 0, roleId, members);
|
||||
}
|
||||
|
||||
// 加入拍卖行
|
||||
@@ -289,6 +314,80 @@ export async function gateActivitySettleReward(guildCode: string, serverId: numb
|
||||
obj.delGuildRecord(guildCode, serverId);
|
||||
}
|
||||
|
||||
async function updateUserRecAndSendHonour(honour: number, myScore: number, rank: number, roleId: string, members: Member[]) {
|
||||
let honourObj = getHonourObject(Math.floor(honour));
|
||||
await sendMail(MAIL_TYPE.GUILD_ACTIVITY_REWARD, roleId, '系统', [], [honourObj])
|
||||
|
||||
await UserGuildActivityRecModel.updateInfoByRoleId(roleId, { score: myScore, rank });
|
||||
let index = members.findIndex(cur => cur.roleId == roleId);
|
||||
members.splice(index, 1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 结算诸侯入侵奖励
|
||||
* @param cityId 城镇id
|
||||
* @param serverId 服务器id
|
||||
*/
|
||||
export async function cityActivitySettleReward(cityId: number, serverId: number) {
|
||||
let obj = getCityActivityObj();
|
||||
|
||||
let dicCity = gameData.cityActivity.get(cityId);
|
||||
if(!dicCity) return;
|
||||
let gateHp = obj.getGateHpAndInc(serverId, cityId, dicCity.hp);
|
||||
let isSuccess = gateHp <= 0; // 血条未击破则没有占领军团
|
||||
|
||||
let guildRankRsult = await getUnionRank(getCityKeyName(REDIS_KEY.CITY_ACTIVITY, cityId), serverId, '');
|
||||
for(let { rank: guildRank, code: guildCode, name, num } of guildRankRsult.ranks) {
|
||||
if(guildRank == 1) {
|
||||
if(isSuccess) {
|
||||
await GuildActivityCityModel.guard(serverId, cityId, guildCode, name); // 占领
|
||||
} else {
|
||||
await GuildActivityCityModel.guard(serverId, cityId, "", ""); // 无人能占领
|
||||
}
|
||||
}
|
||||
let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.CITY_ACTIVITY, guildRank);
|
||||
let members = obj.getMembersOfGuild(guildCode);
|
||||
|
||||
let rec = await GuildActivityRecordModel.updateInfo(guildCode, {
|
||||
memberCnt: members.length, members,
|
||||
isSuccess, isCompleted: true,
|
||||
rank: guildRank, damage: num, remainGateHp: gateHp,
|
||||
rewards,
|
||||
auctionType: AUCTION_SOURCE.CITY,
|
||||
});
|
||||
|
||||
// 奖励加入拍卖行
|
||||
await genAuction(guildCode, AUCTION_SOURCE.GATE, rec.code, serverId, rewards);
|
||||
|
||||
let dic = gameData.guildActivity.get(GUILD_ACTIVITY_TYPE.CITY_ACTIVITY);
|
||||
let memberRankResult = await getRank(getGuildKeyName(REDIS_KEY.USER_GATE_ACTIVITY, guildCode), serverId, '');
|
||||
let userRank = 0;
|
||||
for(let { rank, roleId, num: myScore } of memberRankResult.ranks) {
|
||||
let honour = dic.honour + getCityActivityRewards(dicCity.type, guildRank, rank);
|
||||
await updateUserRecAndSendHonour(honour, myScore, rank, roleId, members);
|
||||
userRank = rank;
|
||||
}
|
||||
for(let { roleId } of members) { // 只参加了,没有分数的人
|
||||
let honour = dic.honour + getCityActivityRewards(dicCity.type, guildRank, userRank);
|
||||
await updateUserRecAndSendHonour(honour, 0, 0, roleId, members);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空完declareGuilds之后,做下一次活动的自动宣战
|
||||
*/
|
||||
async function autoDeclare(serverId: number) {
|
||||
let allCities = await GuildActivityCityModel.getAllCities(serverId);
|
||||
for(let { cityId, guardGuildCode } of allCities) {
|
||||
let dicCity = gameData.cityActivity.get(cityId);
|
||||
if(guardGuildCode && dicCity.nextCity) {
|
||||
await GuildActivityCityModel.declare(serverId, dicCity.nextCity, guardGuildCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取活动参加者
|
||||
* @param guildCode 军团code
|
||||
@@ -302,6 +401,11 @@ export async function participants(guildCode: string, sourceType: number, source
|
||||
return rec.members||[];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取诸侯入侵各个城池状态
|
||||
* @param guildCode 我方军团
|
||||
* @param dbCities 所有城池
|
||||
*/
|
||||
export function getCities(guildCode: string, dbCities: GuildActivityCityType[]) {
|
||||
|
||||
let cities = new Array<CityParam>();
|
||||
|
||||
Reference in New Issue
Block a user