✨ feat(宝物): 添加宝物系统
This commit is contained in:
@@ -1,23 +1,18 @@
|
||||
import { ITID, CONSUME_TYPE, ITEM_TABLE, CURRENCY, CURRENCY_TYPE, MAIL_TYPE, HANDLE_REWARD_TYPE, HERO_SYSTEM_TYPE, CURRENCY_BY_TYPE, ITEM_CHANGE_REASON, TA_USERSET_TYPE, TA_EVENT, POP_UP_SHOP_CONDITION_TYPE, ROLE_SELECT, FIGURE_UNLOCK_CONDITION, PUSH_ROUTE } from '../../consts';
|
||||
import { getDecimalCnt, getRandEelm, getRandEelmWithWeight, getRandSingleEelm, getRandValueByMinMax, resResult } from '../../pubUtils/util';
|
||||
import { ITID, CONSUME_TYPE, ITEM_TABLE, CURRENCY_TYPE, MAIL_TYPE, HANDLE_REWARD_TYPE, HERO_SYSTEM_TYPE, CURRENCY_BY_TYPE, ITEM_CHANGE_REASON, TA_USERSET_TYPE, TA_EVENT, POP_UP_SHOP_CONDITION_TYPE, ROLE_SELECT, FIGURE_UNLOCK_CONDITION, PUSH_ROUTE } from '../../consts';
|
||||
import { getDecimalCnt, getRandEelm, getRandEelmWithWeight, getRandValueByMinMax, } from '../../pubUtils/util';
|
||||
import { RoleModel, RoleType } from '../../db/Role';
|
||||
import { setAp } from '../actionPointService';
|
||||
import { ItemModel, ItemType } from '../../db/Item';
|
||||
import { STATUS } from '../../consts/statusCode';
|
||||
import { pinus } from 'pinus';
|
||||
import { ItemInter, RewardInter, } from '../../pubUtils/interface';
|
||||
import { gameData } from '../../pubUtils/data';
|
||||
import { ItemModel, } from '../../db/Item';
|
||||
import { ItemInter, } from '../../pubUtils/interface';
|
||||
import { gameData, getDefArtifactByGid } from '../../pubUtils/data';
|
||||
import { uniq } from 'underscore';
|
||||
import { EPlace, HeroModel, HeroType, HeroUpdate } from '../../db/Hero';
|
||||
import { EPlace, HeroModel, HeroType, } from '../../db/Hero';
|
||||
import { Figure } from '../../domain/dbGeneral';
|
||||
import { CreateHeroParam, HeroShowParam, JewelParam } from '../../domain/roleField/hero';
|
||||
import { ArtifactParam, JewelParam } from '../../domain/roleField/hero';
|
||||
import { HeroSkin } from '../../db/Hero';
|
||||
import { errlogger } from '../../util/logger';
|
||||
import { BAG } from '../../pubUtils/dicParam';
|
||||
import { sendMailByContent } from '../mailService';
|
||||
import { SkinModel, SkinUpdate } from '../../db/Skin';
|
||||
import { getInitHeroById } from '../roleService';
|
||||
import { getActivities } from '../activity/activityService';
|
||||
import { SkinModel, } from '../../db/Skin';
|
||||
import { reportTAEvent, reportTAUserSet } from '../sdkService';
|
||||
import { saveCoinChangeLog, saveFigureInfoLog, saveGoldChangeLog, saveItemChangeLog } from '../../pubUtils/logUtil';
|
||||
import { JewelModel, JewelType, jewelUpdate, RandSe } from '../../db/Jewel';
|
||||
@@ -25,16 +20,17 @@ import { updateEplaces } from '../equipService';
|
||||
import { combineItems, getCoinEventProperties, getGoldEventProperties, sortItems } from './util';
|
||||
import { nowSeconds } from '../../pubUtils/timeUtil';
|
||||
import { calculateCeWithHero, calculateCeWithRole } from '../playerCeService';
|
||||
import { sendMessageToUsersWithSuc, sendMessageToUserWithSuc } from '../pushService';
|
||||
import { sendMessageToUserWithSuc } from '../pushService';
|
||||
import { filterGoods } from '../dataService';
|
||||
|
||||
|
||||
import { ArtifactModel, ArtifactModelType, ArtifactModelUpdate } from '../../db/Artifact';
|
||||
|
||||
export async function handleCost(roleId: string, sid: string, goods: Array<ItemInter>, reason: ITEM_CHANGE_REASON) {
|
||||
|
||||
let { items, jewels, gold, coin } = sortItems(goods, HANDLE_REWARD_TYPE.COST);
|
||||
let { items, jewels, gold, coin, artifacts } = sortItems(goods, HANDLE_REWARD_TYPE.COST);
|
||||
let jewelSeqIds = jewels.map(cur => cur.seqId);
|
||||
let resJewels: JewelType[] = [];
|
||||
let artifactSeqIds = artifacts.map(cur => cur.seqId);
|
||||
let resArtifacts: ArtifactModelType[] = [];
|
||||
|
||||
// 检查货币是否充足
|
||||
let role = await RoleModel.findByRoleId(roleId);
|
||||
@@ -50,6 +46,12 @@ export async function handleCost(roleId: string, sid: string, goods: Array<ItemI
|
||||
if (resJewels.length < jewels.length)
|
||||
return false;
|
||||
}
|
||||
//检查宝物是否存在
|
||||
if (artifacts.length > 0) {
|
||||
resArtifacts = await ArtifactModel.findbySeqIds(roleId, artifactSeqIds);
|
||||
if (resArtifacts.length < artifacts.length)
|
||||
return false;
|
||||
}
|
||||
//检查并修改道具
|
||||
if (items.length > 0) {
|
||||
let { hasError, result } = await ItemModel.decreaseItems(roleId, items);
|
||||
@@ -90,6 +92,25 @@ export async function handleCost(roleId: string, sid: string, goods: Array<ItemI
|
||||
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.JEWEL_DEL, { jewels: jewels.map(jewel => ({ seqId: jewel.seqId, id: jewel.id, inc: -1, reason })) }, sid);
|
||||
}
|
||||
|
||||
//删除宝物
|
||||
if (resArtifacts.length > 0) {
|
||||
let heroMap = new Map<number, { artifact: ArtifactModelType}>();
|
||||
for(let artifact of resArtifacts) {
|
||||
if(artifact.hid > 0) {
|
||||
heroMap.set(artifact.hid, { artifact });
|
||||
}
|
||||
}
|
||||
for(let [hid, { artifact } ] of heroMap) {
|
||||
// 脱下天晶石
|
||||
await ArtifactModel.putOnOrOff(roleId, artifact.id, 0);
|
||||
await calculateCeWithHero(HERO_SYSTEM_TYPE.PUT_ARTIFACT, roleId, role.serverId, sid, hid, { artifact: 0 });
|
||||
}
|
||||
|
||||
let artifacts = await ArtifactModel.deleteBySeqIds(roleId, artifactSeqIds);
|
||||
saveItemChangeLog(roleId, artifacts.map(artifact => ({ id: artifact.id, count: 1, inc: -1 })), reason);
|
||||
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.ARTIFACT_DEL, { artifacts: artifacts.map(artifact => ({ seqId: artifact.seqId, id: artifact.id, inc: -1, reason })) }, sid);
|
||||
}
|
||||
|
||||
//消耗玩家货币
|
||||
if (gold.length > 0 || coin.length > 0) {
|
||||
let costGold = gold.reduce((pre, cur) => pre + cur.count, 0);
|
||||
@@ -115,7 +136,7 @@ export async function handleCost(roleId: string, sid: string, goods: Array<ItemI
|
||||
|
||||
export async function addItems(roleId: string, roleName: string, sid: string, goods: Array<ItemInter>, reason: ITEM_CHANGE_REASON) {
|
||||
goods = filterGoods(goods, obj => obj.id, roleId, reason);
|
||||
let { items, jewels, gold, coin, ap, skins, figures } = sortItems(goods, HANDLE_REWARD_TYPE.RECEIVE);
|
||||
let { items, jewels, gold, coin, ap, skins, figures, artifacts } = sortItems(goods, HANDLE_REWARD_TYPE.RECEIVE);
|
||||
let showItems: { id: number, seqId?: number, count: number, isBag?: boolean }[] = [];
|
||||
let role = await RoleModel.findByRoleId(roleId);
|
||||
// 1. 装备处理
|
||||
@@ -130,7 +151,7 @@ export async function addItems(roleId: string, roleName: string, sid: string, go
|
||||
}
|
||||
|
||||
// 直接加的
|
||||
let { jewels: jewelInfos } = await addJewels(roleId, roleName, <{id: number, hid?: number}[]>incJewels, reason);
|
||||
let { jewels: jewelInfos } = await addJewels(roleId, roleName, <{id: number }[]>incJewels, reason);
|
||||
for (let jewel of jewelInfos) {
|
||||
showItems.push({ seqId: jewel.seqId, id: jewel.id, count: 1, isBag: true });
|
||||
}
|
||||
@@ -229,6 +250,39 @@ export async function addItems(roleId: string, roleName: string, sid: string, go
|
||||
}
|
||||
}
|
||||
|
||||
// 6. 宝物处理
|
||||
|
||||
if(artifacts.length > 0) {
|
||||
let { artifactCount = 0 } = role;
|
||||
let incArtifacts = artifacts, mailArtifacts: { id?: number, seqId?: number }[] = [];
|
||||
if(artifacts.length + artifactCount > BAG.BAG_ARTIFACT_UPLIMITED) { // 装备上限
|
||||
let inc = BAG.BAG_ARTIFACT_UPLIMITED - artifactCount;
|
||||
if(inc < 0) inc = 0;
|
||||
incArtifacts = artifacts.slice(0, inc);
|
||||
mailArtifacts = artifacts.slice(inc);
|
||||
}
|
||||
|
||||
// 直接加的
|
||||
let { artifacts: artifactInfos } = await addArtifacts(roleId, roleName, <{id: number}[]>incArtifacts, reason);
|
||||
for (let artifact of artifactInfos) {
|
||||
showItems.push({ seqId: artifact.seqId, id: artifact.id, count: 1, isBag: true });
|
||||
}
|
||||
for(let artifact of combineItems(mailArtifacts)) {
|
||||
showItems.push({ id: artifact.id, count: artifact.count, isBag: false });
|
||||
}
|
||||
//装备推送
|
||||
if (!!artifactInfos.length)
|
||||
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.ARTIFACT_ADD, { artifacts: artifactInfos }, sid);
|
||||
//统计装备
|
||||
if (artifactInfos.length > 0) {
|
||||
saveItemChangeLog(roleId, artifactInfos, reason);
|
||||
}
|
||||
// 发邮件的
|
||||
if(mailArtifacts.length > 0) {
|
||||
await sendMailByContent(MAIL_TYPE.ARTIFACT_OVER, roleId, { goods: combineItems(mailArtifacts) });
|
||||
}
|
||||
}
|
||||
|
||||
return showItems;
|
||||
}
|
||||
|
||||
@@ -437,6 +491,20 @@ export function getJewelRandSe(id: number, seid: number) {
|
||||
return new RandSe(id, dicRandom.id, rand);
|
||||
}
|
||||
|
||||
export async function addArtifacts(roleId: string, roleName: string, artifacts: { id: number, }[], reason: number) {
|
||||
let artifactInfos: ArtifactModelUpdate[] = [];
|
||||
for(let { id } of artifacts) {
|
||||
let dicArtifact = getDefArtifactByGid(id);
|
||||
if(dicArtifact) {
|
||||
let { goodId, artifactId, quality, qualityStage } = dicArtifact;
|
||||
artifactInfos.push({ roleId, roleName, id: goodId, artifactId, quality, qualityStage });
|
||||
}
|
||||
}
|
||||
|
||||
const artifactResult = await ArtifactModel.createArtifacts(roleId, artifactInfos);
|
||||
return { artifacts: artifactResult.map(artifact => new ArtifactParam(artifact, true, reason))}
|
||||
}
|
||||
|
||||
export function getGoldId() {
|
||||
return CURRENCY_BY_TYPE.get(CURRENCY_TYPE.GOLD);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user