/*
* Copyright 2014 The Skfiy Open Association.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.skfiy.typhon.spi.hero;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.management.ObjectName;
import org.apache.commons.modeler.ManagedBean;
import org.skfiy.typhon.AbstractComponent;
import org.skfiy.typhon.Typhons;
import org.skfiy.typhon.dobj.EquipmentItemDobj;
import org.skfiy.typhon.dobj.HeroItemDobj;
import org.skfiy.typhon.dobj.ItemDobj;
import org.skfiy.typhon.dobj.Soul;
import org.skfiy.typhon.dobj.SoulItemDobj;
import org.skfiy.typhon.domain.Bag.Node;
import org.skfiy.typhon.domain.IHeroEntity;
import org.skfiy.typhon.domain.IHeroEntity.Rabbet;
import org.skfiy.typhon.domain.Normal;
import org.skfiy.typhon.domain.Player;
import org.skfiy.typhon.domain.item.EquipmentItem;
import org.skfiy.typhon.domain.item.HeroItem;
import org.skfiy.typhon.domain.item.Item.Star;
import org.skfiy.typhon.domain.item.Race;
import org.skfiy.typhon.domain.item.SoulItem;
import org.skfiy.typhon.packet.EnchantPacket;
import org.skfiy.typhon.packet.HeroLottery;
import org.skfiy.typhon.packet.HeroRabbet;
import org.skfiy.typhon.packet.MultipleValue;
import org.skfiy.typhon.packet.Packet;
import org.skfiy.typhon.packet.PacketError;
import org.skfiy.typhon.packet.SingleValue;
import org.skfiy.typhon.repository.impl.UserRepositoryImpl;
import org.skfiy.typhon.session.BagUtils;
import org.skfiy.typhon.session.SessionContext;
import org.skfiy.typhon.session.SessionUtils;
import org.skfiy.typhon.spi.ItemProvider;
import org.skfiy.typhon.spi.RoleProvider;
import org.skfiy.typhon.spi.Vip;
import org.skfiy.typhon.spi.hero.Herofactor.starEnum;
import org.skfiy.typhon.spi.ranking.UpdateRankingList;
import org.skfiy.typhon.spi.role.ExpLevel;
import org.skfiy.typhon.spi.store.Commoditied;
import org.skfiy.typhon.util.ComponentUtils;
import org.skfiy.typhon.util.FastRandom;
import org.skfiy.typhon.util.MBeanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
*
* @author Kevin Zou <kevinz@skfiy.org>
*/
@Singleton
public class HeroProvider extends AbstractComponent {
private static final Logger LOG = LoggerFactory.getLogger(HeroProvider.class);
// 功勋抽奖配置
private final List<Lottery> copperLotteries = new ArrayList<>();
private final List<Lottery> copperX3EquipmentItems = new ArrayList<>();
private final List<Lottery> copperHeroItems = new ArrayList<>();
private final List<Lottery> copperSoulItems = new ArrayList<>();
// 钻石抽奖配置
private final List<Lottery> diamondLotteries = new ArrayList<>();
private final List<Lottery> diamondLotteries2 = new ArrayList<>();
private final List<Lottery> diamondLotteries3 = new ArrayList<>();
private final List<Lottery> diamondLotteries4 = new ArrayList<>();
private final List<Lottery> diamondLotteries5 = new ArrayList<>();
private final List<Lottery> diamondHeroItems = new ArrayList<>();
private final List<Lottery> diamondHeroX2AndX3Items = new ArrayList<>();
private final List<Lottery> diamondHeroX3Items = new ArrayList<>();
private final List<Lottery> diamondHeroX2Items = new ArrayList<>();
private final List<Lottery> diamondHeroX1Items = new ArrayList<>();
private final FastRandom copperRandom = new FastRandom();
private final FastRandom diamondRandom = new FastRandom();
private final FastRandom lotteryCountRandom = new FastRandom();
// 武将升阶配置
private final Map<String, JSONArray> heroLadders = new HashMap<>();
private final JSONArray heroLadderProperties = new JSONArray();
// 武将升星配置
private final Map<String, JSONArray> heroStars = new HashMap<>();
// 土豪抽
private final FastRandom tuhaoRandom = new FastRandom();
private final List<TuhaoWeekLottery> tuhaoWeekLotteries = new ArrayList<>();
private final List<List<Lottery>> tuhaoDayLotteries = new ArrayList<>();
private final List<Lottery> tuhaoLotteries = new ArrayList<>();
// 附魔属性评分
private EnchantFactor enchantPropScoreFactor;
// 附魔权重评分
private EnchantFactor enchantWeightScoreFactor;
@Inject
private ItemProvider itemProvider;
@Inject
private RoleProvider roleProvider;
@Inject
private UpdateRankingList updateRankingLists;
@Inject
private UserRepositoryImpl userRepository;
@Inject
private HeroExclusiveProvider heroExclusiveProvider;
private static JSONArray expLeveArray;
private static JSONArray enchantReturn;
private final Map<String, Integer> enchantCream = new HashMap<>();
private int copperRandomFactor;
private int diamonRandomFactor;
private int diamonRandomFactor2;
private int diamonRandomFactor3;
private int diamonRandomFactor4;
private int diamonRandomFactor5;
private double tuhaoWeekRandomFactor;
private int tuhaoRandomFactor;
private ObjectName oname;
@Override
protected void doInit() {
JSONArray datas = JSON.parseArray(ComponentUtils.readDataFile("copper_lottery.json"));
parseLotteryDatas(datas, copperLotteries, null, "prob");
for (Lottery lo : copperLotteries) {
if (lo.itemDobj instanceof EquipmentItemDobj) {
if (lo.itemDobj.getStar() == Star.X3) {
copperX3EquipmentItems.add(lo);
}
} else if (lo.itemDobj instanceof SoulItemDobj) {
copperSoulItems.add(lo);
} else if (lo.itemDobj instanceof HeroItemDobj) {
copperHeroItems.add(lo);
}
}
copperRandomFactor = calibrateLotteryProb(copperLotteries);
datas = JSON.parseArray(ComponentUtils.readDataFile("diamond_lottery.json"));
parseLotteryDatas(datas, diamondLotteries, diamondHeroItems, "prob");
diamonRandomFactor = calibrateLotteryProb(diamondLotteries);
parseLotteryDatas(datas, diamondLotteries2, null, "prob2");
diamonRandomFactor2 = calibrateLotteryProb(diamondLotteries2);
parseLotteryDatas(datas, diamondLotteries3, null, "prob3");
diamonRandomFactor3 = calibrateLotteryProb(diamondLotteries3);
parseLotteryDatas(datas, diamondLotteries4, null, "prob4");
diamonRandomFactor4 = calibrateLotteryProb(diamondLotteries4);
parseLotteryDatas(datas, diamondLotteries5, null, "prob5");
diamonRandomFactor5 = calibrateLotteryProb(diamondLotteries5);
for (Lottery lo : diamondHeroItems) {
if (lo.itemDobj.getStar() == Star.X3) {
diamondHeroX3Items.add(lo);
} else if (lo.itemDobj.getStar() == Star.X2) {
diamondHeroX2Items.add(lo);
} else if (lo.itemDobj.getStar() == Star.X1) {
diamondHeroX1Items.add(lo);
}
}
diamondHeroX2AndX3Items.addAll(diamondHeroX2Items);
diamondHeroX2AndX3Items.addAll(diamondHeroX3Items);
datas = JSON.parseArray(ComponentUtils.readDataFile("hero_ladder.json"));
for (int i = 0; i < datas.size(); i++) {
JSONObject json = datas.getJSONObject(i);
heroLadders.put(json.getString("#hero.id"), json.getJSONArray("ladders"));
}
heroLadderProperties.addAll(JSON.parseArray(ComponentUtils
.readDataFile("hero_ladder_properties.json")));
datas = JSON.parseArray(ComponentUtils.readDataFile("hero_stars.json"));
for (int i = 0; i < datas.size(); i++) {
JSONObject json = datas.getJSONObject(i);
heroStars.put(json.getString("#hero.id"), json.getJSONArray("stars"));
}
expLeveArray = JSON.parseArray(ComponentUtils.readDataFile("enchant_exp_level.json"));
JSONArray enchantProperty =
JSON.parseArray(ComponentUtils.readDataFile("enchant_property.json"));
enchantPropScoreFactor =
JSON.toJavaObject(enchantProperty.getJSONObject(0), EnchantFactor.class);
enchantWeightScoreFactor =
JSON.toJavaObject(enchantProperty.getJSONObject(1), EnchantFactor.class);
enchantReturn = JSON.parseArray(ComponentUtils.readDataFile("enchant_return.json"));
JSONArray enchantArray =
JSON.parseArray(ComponentUtils.readDataFile("enchant_consume.json"));
for (int i = 0; i < enchantArray.size(); i++) {
JSONObject obj = enchantArray.getJSONObject(i);
enchantCream.put(obj.getString("#item.id"), obj.getInteger("cream"));
}
// =========================================================================================
JSONArray jsonArray =
JSON.parseObject(ComponentUtils.readDataFile("diamond_tuhao_week_lottery.json"))
.getJSONArray("datas");
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
tuhaoWeekLotteries.add(new TuhaoWeekLottery(obj));
}
tuhaoWeekRandomFactor = calibrateLotteryProb2(tuhaoWeekLotteries);
jsonArray =
JSON.parseObject(ComponentUtils.readDataFile("diamond_tuhao_day_lottery.json"))
.getJSONArray("datas");
for (int i = 0; i < jsonArray.size(); i++) {
JSONArray subArray = jsonArray.getJSONArray(i);
List<Lottery> list = new ArrayList<>();
for (int j = 0; j < subArray.size(); j++) {
list.add(new TuhaoLottery(subArray.getJSONObject(j)));
}
calibrateLotteryProb(list);
tuhaoDayLotteries.add(list);
}
jsonArray =
JSON.parseObject(ComponentUtils.readDataFile("diamond_tuhao_lottery.json"))
.getJSONArray("datas");
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
tuhaoLotteries.add(new TuhaoLottery(obj));
}
tuhaoRandomFactor = calibrateLotteryProb(tuhaoLotteries);
// 注册MBean
ManagedBean managedBean = MBeanUtils.findManagedBean(getClass());
oname = MBeanUtils.registerComponent(this, managedBean);
}
@Override
protected void doReload() {
// FIXME 重置武将配置文件
}
@Override
protected void doDestroy() {
if (oname != null) {
MBeanUtils.REGISTRY.unregisterComponent(oname);
}
}
// ================================Begin 获取英雄属性==============================================
/**
* 获取武将"统"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 统
*/
public double getTong(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double tong =
itemDobj.getTong() + heroEntity.getExtraTong() + (heroEntity.getLevel() - 1)
* itemDobj.getTongUp()
* Typhons.getDouble(heroEntity.getStar().getHeroFactorKey());
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
tong += rabbet.getTong();
}
}
return tong;
}
/**
* 获取武将"武"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 武
*/
public double getWu(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double wu =
itemDobj.getWu() + heroEntity.getExtraWu() + (heroEntity.getLevel() - 1)
* itemDobj.getWuUp()
* Typhons.getDouble(heroEntity.getStar().getHeroFactorKey());
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
wu += rabbet.getWu();
}
}
return wu;
}
/**
* 获取武将"智"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 智
*/
public double getZhi(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double zhi
= itemDobj.getZhi() + heroEntity.getExtraZhi() + (heroEntity.getLevel() - 1)
* itemDobj.getZhiUp()
* Typhons.getDouble(heroEntity.getStar().getHeroFactorKey());
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
zhi += rabbet.getZhi();
}
}
return zhi;
}
/**
* 获取武将"攻击力"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 攻击力
*/
public int getAtk(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double atk =
(getTong(heroEntity) * itemDobj.getAtkX() + getWu(heroEntity) * itemDobj.getHpZ())
* itemDobj.getAtkA() + heroEntity.getExtraAtk();
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
atk += rabbet.getAtk();
}
}
if (heroEntity.getWeaponsRabbets() != null) {
atk += heroEntity.getWeaponsRabbets().getAtk();
}
if (heroEntity.getWeaponsEnchant() != null) {
atk += heroEntity.getWeaponsEnchant().getAtk();
}
if (heroEntity.getWeaponsStreng() != null) {
atk += heroEntity.getWeaponsStreng().getAtk();
}
if (heroEntity.getWeaponsBuild() != null) {
atk += heroEntity.getWeaponsBuild().getAtk();
}
// 铁骑增加15%的攻击力
if (heroEntity.getRace() == Race.Qi) {
atk *= 1.15;
}
return (int) atk;
}
/**
* 获取武将"防御力"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 防御力
*/
public int getDef(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double def =
(getTong(heroEntity) * itemDobj.getHpZ() + getWu(heroEntity) * itemDobj.getAtkX())
* itemDobj.getDefB() + heroEntity.getExtraDef();
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
def += rabbet.getDef();
}
}
if (heroEntity.getWeaponsRabbets() != null) {
def += heroEntity.getWeaponsRabbets().getDef();
}
if (heroEntity.getWeaponsEnchant() != null) {
def += heroEntity.getWeaponsEnchant().getDef();
}
if (heroEntity.getWeaponsStreng() != null) {
def += heroEntity.getWeaponsStreng().getDef();
}
if (heroEntity.getWeaponsBuild() != null) {
def += heroEntity.getWeaponsBuild().getDef();
}
// 虎卫增加20%的物理防御
if (heroEntity.getRace() == Race.Bu) {
def *= (1.2);
}
return (int) def;
}
/**
* 获取武将"魔法攻击力"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 魔法攻击力
*/
public int getMatk(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double matk =
(getTong(heroEntity) * itemDobj.getAtkX() + getZhi(heroEntity) * itemDobj.getHpZ())
* itemDobj.getAtkA() + heroEntity.getExtraMatk();
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
matk += rabbet.getMatk();
}
}
if (heroEntity.getWeaponsRabbets() != null) {
matk += heroEntity.getWeaponsRabbets().getMatk();
}
if (heroEntity.getWeaponsEnchant() != null) {
matk += heroEntity.getWeaponsEnchant().getMatk();
}
if (heroEntity.getWeaponsStreng() != null) {
matk += heroEntity.getWeaponsStreng().getMatk();
}
if (heroEntity.getWeaponsBuild() != null) {
matk += heroEntity.getWeaponsBuild().getMatk();
}
// 军师增加15%的法术攻击
if (heroEntity.getRace() == Race.Ce) {
matk *= (1.15);
}
return (int) matk;
}
/**
* 获取武将"魔法防御力"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 魔法防御力
*/
public int getMdef(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double mdef =
(getTong(heroEntity) * itemDobj.getHpZ() + getZhi(heroEntity) * itemDobj.getAtkX())
* itemDobj.getDefB() + heroEntity.getExtraMdef();
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
mdef += rabbet.getMdef();
}
}
if (heroEntity.getWeaponsRabbets() != null) {
mdef += heroEntity.getWeaponsRabbets().getMdef();
}
if (heroEntity.getWeaponsEnchant() != null) {
mdef += heroEntity.getWeaponsEnchant().getMdef();
}
if (heroEntity.getWeaponsStreng() != null) {
mdef += heroEntity.getWeaponsStreng().getMdef();
}
if (heroEntity.getWeaponsBuild() != null) {
mdef += heroEntity.getWeaponsBuild().getMdef();
}
// 战车增加20%的法术防御
if (heroEntity.getRace() == Race.Che) {
mdef *= (1.2);
}
return (int) mdef;
}
/**
* 获取武将"血量"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 血量
*/
public int getHp(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double hp =
(getTong(heroEntity) * itemDobj.getDefY() + getWu(heroEntity) * itemDobj.getDefY() + getZhi(heroEntity)
* itemDobj.getDefY())
* itemDobj.getHpC() + heroEntity.getExtraHp();
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
hp += rabbet.getHp();
}
}
if (heroEntity.getWeaponsRabbets() != null) {
hp += heroEntity.getWeaponsRabbets().getHp();
}
if (heroEntity.getWeaponsEnchant() != null) {
hp += heroEntity.getWeaponsEnchant().getHp();
}
if (heroEntity.getWeaponsStreng() != null) {
hp += heroEntity.getWeaponsStreng().getHp();
}
if (heroEntity.getWeaponsBuild() != null) {
hp += heroEntity.getWeaponsBuild().getHp();
}
return (int) hp;
}
/**
* 获取武将"暴击"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 暴击
*/
public double getCritRate(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double critRate =
(int) Math
.floor((1 / (3 + 3000 / (getZhi(heroEntity) * itemDobj.getAtkX() + getWu(heroEntity)
* itemDobj.getHpZ())) + 0.05)
* 500 + heroEntity.getExtraCritRate());
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
critRate += rabbet.getCritRate();
}
}
if (heroEntity.getWeaponsBuild() != null) {
critRate += heroEntity.getWeaponsBuild().getCritRate();
}
// 神射增加10%的暴击率
if (heroEntity.getRace() == Race.Gong) {
critRate += 50;
}
return critRate / 500;
}
/**
* 获取武将"韧性"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 韧性
*/
public double getDecritRate(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double decritRate =
(int) Math
.floor((0.4 / (3 + 3000 / (getTong(heroEntity) * itemDobj.getAtkX() + getZhi(heroEntity)
* itemDobj.getHpZ())) + 0.03)
* 500 + heroEntity.getExtraDecritRate());
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
decritRate += rabbet.getDecritRate();
}
}
if (heroEntity.getWeaponsBuild() != null) {
decritRate += heroEntity.getWeaponsBuild().getDecritRate();
}
return decritRate / 500;
}
/**
* 获取武将"暴伤"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 暴伤
*/
public double getCritMagn(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double critMagn = (int) Math.floor(itemDobj.getCritMagn() + heroEntity.getExtraCritMagn());
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
critMagn += rabbet.getCritMagn();
}
}
if (heroEntity.getWeaponsBuild() != null) {
critMagn += heroEntity.getWeaponsBuild().getCritMagn();
}
return critMagn / 100;
}
/**
* 获取武将"格挡"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 格挡
*/
public double getParryRate(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double parryRate =
(int) Math
.floor((0.8 / (3 + 3000 / (getTong(heroEntity) * itemDobj.getAtkX() + getWu(heroEntity)
* itemDobj.getHpZ())) + 0.05)
* 500 + heroEntity.getExtraParryRate());
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
parryRate += rabbet.getParryRate();
}
}
if (heroEntity.getWeaponsBuild() != null) {
parryRate += heroEntity.getWeaponsBuild().getParryRate();
}
return parryRate / 500;
}
/**
* 获取武将"穿透"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 穿透
*/
public double getDeparryRate(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double deparryRate =
(int) Math
.floor((0.5 / (3 + 3000 / (getZhi(heroEntity) * itemDobj.getHpZ() + getWu(heroEntity)
* itemDobj.getAtkX())) + 0.03)
* 600 + heroEntity.getExtraDeparryRate());
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
deparryRate += rabbet.getDeparryRate();
}
}
if (heroEntity.getWeaponsBuild() != null) {
deparryRate += heroEntity.getWeaponsBuild().getDeparryRate();
}
return deparryRate / 600;
}
/**
* 获取武将"免伤值"属性. 返回值包括武将本身, 装备与附魔总值.
*
* @param heroEntity 武将实体
* @return 免伤值
*/
public double getParryValue(IHeroEntity heroEntity) {
HeroItemDobj itemDobj = getHeroItemDobj(heroEntity);
double parryValue =
(int) Math.floor(itemDobj.getParryValue() + heroEntity.getExtraParryValue());
if (heroEntity.getRabbets() != null && heroEntity.getRabbets().size() > 0) {
for (Rabbet rabbet : heroEntity.getRabbets()) {
parryValue += rabbet.getParryValue();
}
}
return parryValue;
}
private HeroItemDobj getHeroItemDobj(IHeroEntity heroEntity) {
if (heroEntity instanceof HeroItem) {
return ((HeroItem) heroEntity).getItemDobj();
} else {
return itemProvider.getItem(heroEntity.getId());
}
}
// ================================End 获取英雄属性================================================
/**
* 增加指定武将经验.
*
* @param roleLevel 玩家等级
* @param hero 英雄
* @param exp 经验值
*/
public void pushExp(int roleLevel, HeroItem hero, int exp) {
if (exp <= 0) {
return;
}
ExpLevel expLevel = roleProvider.getExpLevel(hero.getLevel());
if (isMaxLevel(roleLevel, hero.getLevel()) && hero.getExp() >= expLevel.getHeroExp()) {
return;
}
int oldExp = hero.getExp();
int newExp = oldExp + exp;
int newLevel = hero.getLevel();
while (true) {
expLevel = roleProvider.getExpLevel(newLevel);
if (newExp < expLevel.getHeroExp()) {
break;
}
if (isMaxLevel(roleLevel, newLevel)) {
ExpLevel curLevel = roleProvider.getExpLevel(newLevel);
if (newExp > curLevel.getHeroExp()) {
newExp = curLevel.getHeroExp();
}
break;
}
newExp -= expLevel.getHeroExp();
newLevel++;
}
if (newLevel > hero.getLevel()) {
hero.setLevel(newLevel);
calculatorPowerGuess(hero);
}
hero.setExp(newExp);
}
/**
* 判定武将是否已经达到目前最高等级.
*
* @param roleLevel 角色等级
* @param heroLevel 武将等级
* @return 真/假
*/
public boolean isMaxLevel(int roleLevel, int heroLevel) {
ExpLevel expLevel = roleProvider.getExpLevel(roleLevel);
return (heroLevel >= expLevel.getHeroMaxLevel());
}
/**
* 计算武将战斗力.
*
* @param heroItem 武将对象
*/
public void calculatorPowerGuess(HeroItem heroItem) {
double atk = Math.max(getAtk(heroItem), getMatk(heroItem));
double bj = (1 + getCritRate(heroItem) * (getCritMagn(heroItem) - 1));
double ct = (1 + getDeparryRate(heroItem) * 0.05) * 1.2;
double def = (getDef(heroItem) + (double) getMdef(heroItem)) / 2;
double ms = (getParryRate(heroItem) * getParryValue(heroItem) * 0.6);
double hp = (getHp(heroItem) * 0.1);
double rx = (1 + getDecritRate(heroItem) * 0.5);
int pg =
(int) ((atk * bj * ct + (def + ms + hp) * rx) * Typhons.getDouble(heroItem
.getRace().getHeroRace()));
heroItem.setPowerGuess(pg);
if (SessionUtils.isSessionAvailable()) {
updateRankingLists.updatePowerguessRanking();
// roleProvider.updateInformation();
}
}
// 一键穿装备
public void activateRabbetAll(HeroRabbet packet) {
Player player = SessionUtils.getPlayer();
Vip vip = roleProvider.getVip(player.getNormal().getVipLevel());
if (!vip.privileged.one_key_equipment) {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.item_not_found);
error.setText("VIPLEVEL is not enought");
player.getSession().write(error);
return;
}
HeroItem heroItem = player.getHeroBag().findNode(packet.getPos()).getItem();
if (heroItem == null) {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.item_not_found);
error.setText("Not found pos[" + packet.getPos() + "] item");
player.getSession().write(error);
return;
}
JSONArray ladder = heroLadders.get(heroItem.getId()).getJSONArray(heroItem.getLadder() - 1);
String eid;
Node equmNode;
List<Integer> posts = new ArrayList<>();
for (int i = 1; i <= 6; i++) {
if (heroItem.findRabbet(i) == null) {
eid = ladder.getString(i - 1);
equmNode = player.getBag().findNode(eid);
if (equmNode != null
&& heroItem.getLevel() >= ((EquipmentItem) equmNode.getItem())
.getLevelLimit()) {
EquipmentItem equipmentItem = equmNode.getItem();
activateRabbet(i, heroItem, equipmentItem.getItemDobj());
// 消耗道具
player.getBag().decrementTotal(equmNode, 1);
posts.add(i);
}
}
}
SingleValue result = new SingleValue();
Packet.assignResult(packet, result);
result.setVal(posts);
player.getSession().write(result);
}
/**
* 激动武将槽口(进阶).
*
* @param packet 数据包
*/
public void activateRabbet(HeroRabbet packet) {
Player player = SessionUtils.getPlayer();
HeroItem heroItem = player.getHeroBag().findNode(packet.getPos()).getItem();
if (heroItem == null) {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.item_not_found);
error.setText("Not found pos[" + packet.getPos() + "] item");
player.getSession().write(error);
return;
}
if (heroItem.findRabbet(packet.getPoint()) != null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.bat_request);
error.setText("Activated");
player.getSession().write(error);
return;
}
JSONArray ladder = heroLadders.get(heroItem.getId()).getJSONArray(heroItem.getLadder() - 1);
String eid = ladder.getString(packet.getPoint() - 1);
Node equmNode = player.getBag().findNode(eid);
if (equmNode == null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText(heroItem.getId() + ":Not found equipment[" + eid + "]");
player.getSession().write(error);
return;
}
if (heroItem.getLevel() < ((EquipmentItem) equmNode.getItem()).getLevelLimit()) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("level limit");
player.getSession().write(error);
return;
}
// 转移装备增加的属性至武将身上
EquipmentItem equipmentItem = equmNode.getItem();
activateRabbet(packet.getPoint(), heroItem, equipmentItem.getItemDobj());
player.getBag().decrementTotal(equmNode, 1); // 消耗道具
player.getSession().write(Packet.createResult(packet));
}
/**
* 激活武将的槽点.
*
* @param point 槽点
* @param heroItem 形状对象
* @param eqipmentItemDobj 装备对象, 如果该对象为null, 则通过武将的等阶, 及point来获取对应的装备对象
*/
public void activateRabbet(int point, HeroItem heroItem, EquipmentItemDobj eqipmentItemDobj) {
if (eqipmentItemDobj == null) {
JSONArray ladder =
heroLadders.get(heroItem.getId()).getJSONArray(heroItem.getLadder() - 1);
String eid = ladder.getString(point - 1);
eqipmentItemDobj = itemProvider.getItem(eid);
}
heroItem.setExtraTong(heroItem.getExtraTong() + eqipmentItemDobj.getTong());
heroItem.setExtraWu(heroItem.getExtraWu() + eqipmentItemDobj.getWu());
heroItem.setExtraZhi(heroItem.getExtraZhi() + eqipmentItemDobj.getZhi());
heroItem.setExtraAtk(heroItem.getExtraAtk() + eqipmentItemDobj.getAtk());
heroItem.setExtraDef(heroItem.getExtraDef() + eqipmentItemDobj.getDef());
heroItem.setExtraMatk(heroItem.getExtraMatk() + eqipmentItemDobj.getMatk());
heroItem.setExtraMdef(heroItem.getExtraMdef() + eqipmentItemDobj.getMdef());
heroItem.setExtraHp(heroItem.getExtraHp() + eqipmentItemDobj.getHp());
heroItem.setExtraParryRate(heroItem.getExtraParryRate() + eqipmentItemDobj.getParryRate());
heroItem.setExtraParryValue(heroItem.getExtraParryValue()
+ eqipmentItemDobj.getParryValue());
heroItem.setExtraCritRate(heroItem.getExtraCritRate() + eqipmentItemDobj.getCritRate());
heroItem.setExtraDecritRate(heroItem.getExtraDecritRate()
+ eqipmentItemDobj.getDecritRate());
heroItem.setExtraDeparryRate(heroItem.getExtraDeparryRate()
+ eqipmentItemDobj.getDeparryRate());
heroItem.setExtraCritMagn(heroItem.getExtraCritMagn() + eqipmentItemDobj.getCritMagn());
Rabbet rabbet = new Rabbet();
rabbet.setPoint(point);
heroItem.addRabbet(rabbet);
calculatorPowerGuess(heroItem);
}
/**
*
* @param packet
*/
public void enchantOnce(EnchantPacket packet) {
Player player = SessionUtils.getPlayer();
HeroItem heroItem = player.getHeroBag().findNode(packet.getPos()).getItem();
if (heroItem.findRabbet(packet.getPoint()) == null) {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.item_not_found);
error.setText("the hore is not equipment");
player.getSession().write(error);
return;
}
int expAdd = 0;
int number = 0;
for (int a : packet.getExpendables()) {
number += a;
expAdd = (int) (a * Typhons.getDouble("typhon.spi.role.enchant.diamond.factor", 1));
}
JSONArray ladder = heroLadders.get(heroItem.getId()).getJSONArray(heroItem.getLadder() - 1);
String eid = ladder.getString(packet.getPoint() - 1);
Rabbet rabbet = start(expAdd, heroItem, eid, heroItem.findRabbet(packet.getPoint()));
if (rabbet != null) {
heroItem.setRabbet(rabbet);
calculatorPowerGuess(heroItem);
JSONObject object = new JSONObject();
object.put("place", "EnchantOnce");
object.put("heroId", heroItem.getId());
object.put("heroStar", heroItem.getStar());
object.put("equipmentPoint", packet.getPoint());
SessionUtils.decrementDiamond(number, object.toString());
}
player.getSession().write(Packet.createResult(packet));
}
/**
*
* @param packet
*/
public void enchantRise(EnchantPacket packet) {
Player player = SessionUtils.getPlayer();
HeroItem heroItem = player.getHeroBag().findNode(packet.getPos()).getItem();
if (heroItem.findRabbet(packet.getPoint()) == null) {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.item_not_found);
error.setText("the hore is not equipment");
player.getSession().write(error);
return;
}
JSONArray ladder = heroLadders.get(heroItem.getId()).getJSONArray(heroItem.getLadder() - 1);
String eid = ladder.getString(packet.getPoint() - 1);
Rabbet rabbet =
enchant(heroItem, player, packet, eid, heroItem.findRabbet(packet.getPoint()));
if (rabbet != null) {
heroItem.setRabbet(rabbet);
calculatorPowerGuess(heroItem);
}
player.getSession().write(Packet.createResult(packet));
}
public Rabbet enchant(HeroItem heroItem, Player player, EnchantPacket packet, String eid,
Rabbet rabbet) {
List<Integer> a = packet.getExpendables();
Set<Integer> c = new HashSet<>();
int expAdd = 0;
Map<Node, Integer> nodes = new HashMap<>();
for (int i = 0; i < a.size(); i++) {
c.add(a.get(i));
}
for (int b : c) {
Node node = player.getBag().findNode(b);
int count = 0;
for (int j = 0; j < a.size(); j++) {
if (b == a.get(j)) {
count++;
}
if (j == a.size() - 1) {
expAdd += enchantCream.get(node.getItem().getId()) * count;
nodes.put(node, count);
}
}
}
Rabbet newRabbet = start(expAdd, heroItem, eid, rabbet);
if (newRabbet != null) {
SessionUtils.decrementCopper((expAdd * Typhons.getInteger(
"typhon.spi.hero.enchant.depletion", 1000)));
for (Map.Entry<Node, Integer> entry : nodes.entrySet()) {
player.getBag().decrementTotal(entry.getKey(), entry.getValue());
}
}
return newRabbet;
}
private List<Commoditied> enchantReturn(HeroItem heroItem) {
int exp = 0;
for (Rabbet r : heroItem.getRabbets()) {
exp += r.getExpSum();
}
return enchantReturn1(exp);
}
public List<Commoditied> enchantReturn1(int exp) {
List<Commoditied> commodities = new ArrayList<>();
exp = (int) (exp * Typhons.getDouble("typhon.spi.hero.enchant.return", 0.5));
// 个位不为0 向上进1
if (exp % 10 != 0) {
exp = exp / 10 * 10;
if (exp == 0) {
return commodities;
}
}
for (int i = 0; i < enchantReturn.size(); i++) {
Commoditied commoditied = new Commoditied();
JSONObject object = enchantReturn.getJSONObject(i);
int b = exp / object.getIntValue("exp");
if (b <= 0) {
continue;
}
String id = object.getString("#item.id");
commoditied.setId(id);
commoditied.setCount(b);
commodities.add(commoditied);
BagUtils.intoItem(itemProvider.getItem(id), b);
int a = exp % object.getIntValue("exp");
if (a > 0) {
exp = a;
continue;
}
if (a == 0) {
break;
}
}
return commodities;
}
/**
*
* @param packet
*/
public void upgradeLadder(HeroRabbet packet) {
Player player = SessionUtils.getPlayer();
HeroItem heroItem = player.getHeroBag().findNode(packet.getPos()).getItem();
// 判断武将装备是否足够升阶
if (heroItem.getRabbets().size() < 6) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("No upgrade");
player.getSession().write(error);
return;
}
if (heroItem.getLadder() >= Typhons.getInteger("typhon.domain.hero.maxLadder", 15)) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Already the largest");
player.getSession().write(error);
return;
}
// 进阶增加武将的属性
JSONObject ladderProperty = heroLadderProperties.getJSONObject(heroItem.getLadder() - 1);
heroItem.setExtraTong(heroItem.getExtraTong() + ladderProperty.getIntValue("tong"));
heroItem.setExtraWu(heroItem.getExtraWu() + ladderProperty.getIntValue("wu"));
heroItem.setExtraZhi(heroItem.getExtraZhi() + ladderProperty.getIntValue("zhi"));
heroItem.setLadder(heroItem.getLadder() + 1);
SingleValue result = new SingleValue();
Packet.assignResult(packet, result);
result.setVal(enchantReturn(heroItem));
heroItem.clearRabbets();
calculatorPowerGuess(heroItem);
player.getSession().write(result);
}
/**
* 武将升星.
*
* @param packet 协议包
*/
public void upstar(SingleValue packet) {
Player player = SessionUtils.getPlayer();
HeroItem heroItem = player.getHeroBag().findNode((int) packet.getVal()).getItem();
HeroItem.Star star = heroItem.getStar();
if (star == HeroItem.Star.X5) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("highest-star");
player.getSession().write(error);
return;
}
HeroItem.Star nextStar = HeroItem.Star.values()[star.ordinal() + 1];
JSONArray jsonArray = heroStars.get(heroItem.getId());
int soulCount = Integer.MAX_VALUE;
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
if (nextStar.name().equals(obj.getString("star"))) {
soulCount = obj.getIntValue("soulCount");
break;
}
}
Node soulNode =
player.getBag().findNode(heroItem.getItemDobj().getSoul().getItemDobj().getId());
if (!player.getBag().decrementTotal(soulNode, soulCount)) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("soul not enough");
player.getSession().write(error);
return;
}
heroItem.setStar(nextStar);
calculatorPowerGuess(heroItem);
player.getSession().write(Packet.createResult(packet));
}
/**
* 武将召唤.
*
* @param packet 协议包
*/
public void beckon(SingleValue packet) {
Player player = SessionUtils.getPlayer();
Node soul = player.getBag().findNode((int) packet.getVal());
SoulItem soulItem = soul.getItem();
SoulItemDobj soulItemDobj = soulItem.getItemDobj();
// 已经存在对应的武将
if (player.getHeroBag().findNode(soulItemDobj.getHeroItemDobj().getId()) != null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("exists hero");
player.getSession().write(error);
return;
}
SessionUtils.decrementCopper(soulItemDobj.getDepletion());
if (!player.getBag().decrementTotal(soul, soulItemDobj.getCount())) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("count not enought");
player.getSession().write(error);
return;
}
player.getHeroBag().intoItem(soulItemDobj.getHeroItemDobj());
player.getSession().write(Packet.createResult(packet));
}
/**
* 金币抽卡.
*
* @param packet 协议包
*/
public void buyCopperLottery(Packet packet) {
Normal normal = SessionUtils.getPlayer().getNormal();
boolean freed = false;
int freeCount = normal.getFreeCount();
if (freeCount > 0) {
freed =
(normal.getLastBuyCopperTime() + Typhons
.getLong("typhon.spi.hero.copperLottery.freeCD")) < System
.currentTimeMillis();
}
if (!freed) {
int depletion = Typhons.getInteger("typhon.spi.hero.copperLottery.1.depletion");
SessionUtils.decrementCopper(depletion);
} else {
normal.setFreeCount(freeCount - 1);
normal.setLastBuyCopperTime(System.currentTimeMillis());
}
Lottery lottery = spueLottery(copperRandom, copperLotteries, copperRandomFactor);
Packet result = pushLottery(lottery, false, false);
Packet.assignResult(packet, result);
SessionContext.getSession().write(result);
}
/**
* 金币10连抽.
*
* @param packet 协议包
*/
public void buyCopperLottery10(Packet packet) {
int depletion = Typhons.getInteger("typhon.spi.hero.copperLottery.10.depletion");
SessionUtils.decrementCopper(depletion);
Normal normal = SessionUtils.getPlayer().getNormal();
MultipleValue result = MultipleValue.createResult(packet);
Lottery lottery;
if (!normal.isFirstC10Lottery()) {
// 金币十连抽必出武将卡且不能是五小强
String initHeros = Typhons.getProperty("typhon.spi.player.initHeros");
for (;;) {
lottery = copperHeroItems.get(copperRandom.nextInt(copperHeroItems.size()));
if (!initHeros.contains(lottery.itemDobj.getId())) {
break;
}
}
result.addVal(pushLottery(lottery, false, false));
normal.setFirstC10Lottery(true);
} else {
// 灵魂石
lottery = copperSoulItems.get(copperRandom.nextInt(copperSoulItems.size()));
result.addVal(pushLottery(lottery, false, false));
}
// 3星装备
lottery = copperX3EquipmentItems.get(copperRandom.nextInt(copperX3EquipmentItems.size()));
result.addVal(pushLottery(lottery, false, false));
for (int i = 0; i < 8; i++) {
lottery = spueLottery(copperRandom, copperLotteries, copperRandomFactor);
result.addVal(pushLottery(lottery, false, false));
}
Packet.assignResult(packet, result);
SessionContext.getSession().write(result);
}
/**
* 钻石抽卡.
*
* @param packet 协议包
*/
public void buyDiamondLottery(Packet packet) {
Normal normal = SessionUtils.getPlayer().getNormal();
boolean freed =
(normal.getLastBuyDiamondTime() + Typhons
.getLong("typhon.spi.hero.diamondLottery.freeCD")) < System
.currentTimeMillis();
Lottery lottery;
if (!freed) {
int depletion = Typhons.getInteger("typhon.spi.hero.diamondLottery.1.depletion");
// 钻石首次抽卡必出3星英雄
if (!normal.isFirstD1Lottery()) {
for (;;) {
lottery =
diamondHeroX3Items
.get(diamondRandom.nextInt(diamondHeroX3Items.size()));
// 首次单抽不出“关羽”
if (!"hb02".equals(lottery.itemDobj.getId())) {
break;
}
}
normal.setFirstD1Lottery(true);
} else {
lottery = diamondSpueLottery(normal);
}
JSONObject object = new JSONObject();
object.put("place", "BuyDiamondLottery");
object.put("lotteryItems", lottery.itemDobj.getId());
SessionUtils.decrementDiamond(depletion, object.toString());
} else {
normal.setLastBuyDiamondTime(System.currentTimeMillis());
// 免费抽卡采用第5档概率
lottery = spueLottery(diamondRandom, diamondLotteries5, diamonRandomFactor5);
}
Packet result = pushLottery(lottery, true, false);
Packet.assignResult(packet, result);
SessionContext.getSession().write(result);
}
/**
* 钻石10连抽.
*
* @param packet 协议包
*/
public void buyDiamondLottery10(Packet packet) {
int depletion = Typhons.getInteger("typhon.spi.hero.diamondLottery.10.depletion");
Player player = SessionUtils.getPlayer();
Normal normal = player.getNormal();
MultipleValue result = MultipleValue.createResult(packet);
int c = 10;
LotteryLimit lotteryLimit = new LotteryLimit(4, 3);
Lottery lottery;
// 钻石10连抽必出3星, 2星, 1星英雄
if (!normal.isFirstD10Lottery()) {
lottery = diamondHeroX3Items.get(diamondRandom.nextInt(diamondHeroX3Items.size()));
result.addVal(pushLottery(lottery, true, false));
lotteryLimit.hero++;
lottery = diamondHeroX2Items.get(diamondRandom.nextInt(diamondHeroX2Items.size()));
result.addVal(pushLottery(lottery, true, false));
lotteryLimit.hero++;
lottery = diamondHeroX1Items.get(diamondRandom.nextInt(diamondHeroX1Items.size()));
result.addVal(pushLottery(lottery, true, false));
lotteryLimit.hero++;
normal.setDiamondLotteryCount(normal.getDiamondLotteryCount() + 3);
normal.setFirstD10Lottery(true);
c -= 3;
} else {
lottery =
diamondHeroX2AndX3Items.get(diamondRandom.nextInt(diamondHeroX2AndX3Items
.size()));
result.addVal(pushLottery(lottery, true, false));
normal.setDiamondLotteryCount(normal.getDiamondLotteryCount() + 1);
lotteryLimit.hero++;
c--;
}
boolean isSoul;
for (int i = 0; i < c; i++) {
for (;;) {
lottery = diamondSpueLottery(normal);
if (lottery.isHero && lotteryLimit.isMaxHero()) {
continue;
} else {
isSoul = (lottery.itemDobj instanceof SoulItemDobj);
if (isSoul && lotteryLimit.isMaxSoul()) {
continue;
}
}
result.addVal(pushLottery(lottery, true, false));
if (lottery.isHero) {
lotteryLimit.hero++;
}
if (isSoul) {
lotteryLimit.soul++;
}
break;
}
}
JSONObject object = new JSONObject();
object.put("place", "BuyDiamondLottery10");
object.put("lottery10Items", result.getVals());
SessionUtils.decrementDiamond(depletion, object.toString());
player.getSession().write(result);
}
/**
*
* @param packet
*/
public void buyTuhaoLottery(Packet packet) {
Player player = SessionUtils.getPlayer();
MultipleValue result = MultipleValue.createResult(packet);
Calendar cal = Calendar.getInstance();
// 抽卡
int weekOfYear = cal.get(Calendar.WEEK_OF_YEAR);
if (weekOfYear != 1 && cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
weekOfYear--;
}
TuhaoWeekLottery tuhaoWeekLottery = tuhaoWeekLotteries.get(weekOfYear - 1);
boolean heroed = drawTuhao0(player, tuhaoWeekLottery);
if (heroed) {
result.addVal(pushLottery(tuhaoWeekLottery, false, true));
} else {
int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
Lottery tuhaoDayLottery =
spueLottery(tuhaoRandom, tuhaoDayLotteries.get(dayOfMonth - 1), 100);
result.addVal(pushLottery(tuhaoDayLottery, false, true));
}
Lottery tuhaoLottery;
for (int i = 0; i < 5; i++) {
tuhaoLottery = spueLottery(tuhaoRandom, tuhaoLotteries, tuhaoRandomFactor);
result.addVal(pushLottery(tuhaoLottery, false, true));
}
int diamond = Typhons.getInteger("typhon.spi.hero.diamondTuhaoLottery.1.depletion");
JSONObject plog = new JSONObject();
plog.put("name", "Tuhao");
plog.put("items", result.getVals());
SessionUtils.decrementDiamond(diamond, plog.toJSONString());
player.getSession().write(result);
}
private boolean drawTuhao0(Player player, TuhaoWeekLottery tuhaoWeekLottery) {
int ttc = player.getInvisible().getTuhaoLotteryCount();
double prob = tuhaoWeekLottery.prob1;
if (ttc <= 10) {
prob += (tuhaoWeekLottery.prob1 * ttc);
} else if (ttc <= 25) {
prob += (tuhaoWeekLottery.prob1 * 10);
prob += (tuhaoWeekLottery.prob2 * (ttc - 10));
} else if (ttc <= tuhaoWeekLottery.maxNum) {
prob += (tuhaoWeekLottery.prob1 * 10);
prob += (tuhaoWeekLottery.prob2 * 15);
prob += (tuhaoWeekLottery.prob3 * (ttc - 25));
}
if (ttc >= (tuhaoWeekLottery.maxNum - 1) || tuhaoRandom.nextDouble() < prob) {
player.getInvisible().setTuhaoLotteryCount(0);
return true;
}
player.getInvisible().setTuhaoLotteryCount(ttc + 1);
return false;
}
private HeroLottery pushLottery(Lottery lottery, boolean diamond, boolean tuhaoed) {
Player player = SessionUtils.getPlayer();
Normal normal = player.getNormal();
int counts = normal.getDailyTask().getTaskLotteries();
if (counts >= 0) {
normal.getDailyTask().setTaskLotteries(counts + 1);
}
boolean souled = false;
int count = 1;
if (lottery.isHero) {
souled = player.getHeroBag().findNode(lottery.itemDobj.getId()) != null;
if (!souled) {
player.getHeroBag().intoItem(lottery.itemDobj);
} else {
Soul soul = ((HeroItemDobj) lottery.itemDobj).getSoul();
player.getBag().intoItem(soul.getItemDobj(), soul.getCount());
}
} else {
int prob = lotteryCountRandom.nextInt(100);
if (tuhaoed) {
if (lottery.itemDobj instanceof SoulItemDobj) {
if (prob < 60) {
count = 3;
} else if (count < 95) {
count = 5;
} else {
count = 10;
}
} else {
if (prob < 70) {
count = 1;
} else if (count < 99) {
count = 2;
} else {
count = 4;
}
}
} else if (diamond) { // 钻石抽卡
if (lottery.itemDobj instanceof SoulItemDobj) {
if (prob < 60) {
count = 3;
} else if (count < 90) {
count = 4;
} else {
count = 5;
}
} else {
if (prob < 70) {
count = 1;
} else if (count < 99) {
count = 2;
} else {
count = 3;
}
}
} else { // 金币抽卡
if (prob < 70) {
count = 1;
} else if (count < 99) {
count = 2;
} else {
count = 3;
}
}
player.getBag().intoItem(lottery.itemDobj, count);
}
HeroLottery packet = new HeroLottery();
packet.setIid(lottery.itemDobj.getId());
packet.setCount(count);
packet.setSouled(souled);
return packet;
}
private Lottery diamondSpueLottery(Normal normal) {
// 如果抽卡次数超过200次则回到第31次继续抽卡
if (normal.getDiamondLotteryCount() > 200) {
normal.setDiamondLotteryCount(31);
}
Lottery lottery;
if (normal.getDiamondLotteryCount() <= 30) {
lottery = spueLottery(diamondRandom, diamondLotteries, diamonRandomFactor);
} else if (normal.getDiamondLotteryCount() <= 60) {
lottery = spueLottery(diamondRandom, diamondLotteries2, diamonRandomFactor2);
} else if (normal.getDiamondLotteryCount() <= 90) {
lottery = spueLottery(diamondRandom, diamondLotteries3, diamonRandomFactor3);
} else if (normal.getDiamondLotteryCount() <= 130) {
lottery = spueLottery(diamondRandom, diamondLotteries4, diamonRandomFactor4);
} else {
lottery = spueLottery(diamondRandom, diamondLotteries5, diamonRandomFactor5);
}
normal.setDiamondLotteryCount(normal.getDiamondLotteryCount() + 1);
return lottery;
}
private Lottery spueLottery(FastRandom ran, List<Lottery> lotteries, int factor) {
int prob = ran.nextInt(factor);
for (Lottery lo : lotteries) {
if (prob <= lo.prob) {
return lo;
}
}
return lotteries.get(ran.nextInt(lotteries.size()));
}
private void parseLotteryDatas(JSONArray datas, List<Lottery> target,
List<Lottery> targetHeroItems, String probKey) {
for (int i = 0; i < datas.size(); i++) {
JSONObject json = datas.getJSONObject(i);
Lottery lottery =
new Lottery(itemProvider.getItem(json.getString("iid")),
json.getIntValue(probKey));
target.add(lottery);
if (targetHeroItems != null) {
if (lottery.itemDobj instanceof HeroItemDobj) {
targetHeroItems.add(lottery);
}
}
}
}
private int calibrateLotteryProb(List<Lottery> lotteries) {
Lottery prev = null;
for (Lottery lottery : lotteries) {
if (prev == null) {
prev = lottery;
continue;
}
lottery.prob += prev.prob;
prev = lottery;
}
Lottery last = lotteries.get(lotteries.size() - 1);
return last.prob;
}
private double calibrateLotteryProb2(List<TuhaoWeekLottery> lotteries) {
TuhaoWeekLottery prev = null;
for (TuhaoWeekLottery lottery : lotteries) {
if (prev == null) {
prev = lottery;
continue;
}
lottery.prob += prev.prob;
prev = lottery;
}
TuhaoWeekLottery last = lotteries.get(lotteries.size() - 1);
return last.prob;
}
private class Lottery {
ItemDobj itemDobj;
int prob;
boolean isHero;
Lottery() {}
Lottery(JSONObject json) {
itemDobj = itemProvider.getItem(json.getString("iid"));
prob = json.getIntValue("prob");
isHero = (itemDobj instanceof HeroItemDobj);
}
Lottery(ItemDobj itemDobj, int prob) {
this.itemDobj = itemDobj;
this.prob = prob;
isHero = (itemDobj instanceof HeroItemDobj);
}
}
private class TuhaoWeekLottery extends Lottery {
double prob1;
double prob2;
double prob3;
int maxNum;
TuhaoWeekLottery(JSONObject json) {
itemDobj = itemProvider.getItem(json.getString("#item.id"));
prob1 = json.getDoubleValue("prob1");
prob2 = json.getDoubleValue("prob2");
prob3 = json.getDoubleValue("prob3");
maxNum = json.getIntValue("maxNum");
isHero = (itemDobj instanceof HeroItemDobj);
}
}
private class TuhaoLottery extends Lottery {
TuhaoLottery(JSONObject json) {
itemDobj = itemProvider.getItem(json.getString("#item.id"));
prob = json.getIntValue("prob");
isHero = (itemDobj instanceof HeroItemDobj);
}
}
public Rabbet start(int expAdd, HeroItem heroItem, String eid, Rabbet rabbet) {
Player player = SessionUtils.getPlayer();
int counts = player.getNormal().getDailyTask().getTaskEnchants();
if (counts >= 0) {
player.getNormal().getDailyTask().setTaskEnchants(counts + 1);
}
int exp = 0;
expAdd += rabbet.getExp();
int level = rabbet.getLevel();
int expSum = rabbet.getExpSum();
Herofactor herofactor = enchantStar(eid);
if (levelLimit(level, herofactor.getLevel())
|| heroExclusiveProvider.limit(level, eid, heroItem)) {
return null;
}
while (true) {
if (levelLimit(level, herofactor.getLevel())
|| heroExclusiveProvider.limit(level, eid, heroItem)) {
expAdd = 0;
break;
}
exp = herofactor.getExps().get(level);
if (expAdd < exp) {
break;
}
level++;
expSum += exp;
expAdd -= exp;
}
if (level != rabbet.getLevel() || exp != rabbet.getExp()) {
rabbet.setExpSum(expSum + expAdd - rabbet.getExp());
}
rabbet.setExp(expAdd);
rabbet.setLevel(level);
counting(rabbet, eid, herofactor.getFactorNamber());
return rabbet;
}
private void counting(Rabbet rabbet, String eid, double d) {
int lv = rabbet.getLevel();
EquipmentItemDobj equip = itemProvider.getItem(eid);
double propScore = calculatorProps(equip, enchantPropScoreFactor) * d;
double weightScore = calculatorProps(equip, enchantWeightScoreFactor);
double f = 0;
if (equip.getTong() != 0 || equip.getWu() != 0 || equip.getZhi() != 0) {
f = Typhons.getDouble("typhon.domain.hero.factorOne", 1);
}
if (equip.getTong() != 0 && equip.getWu() != 0 || equip.getWu() != 0 && equip.getZhi() != 0
|| equip.getZhi() != 0 && equip.getTong() != 0) {
f = Typhons.getDouble("typhon.domain.hero.factorTwo", 1.2);
}
if (equip.getZhi() != 0 && equip.getTong() != 0 && equip.getWu() != 0) {
f = Typhons.getDouble("typhon.domain.hero.factorThree", 1.5);
}
rabbet.setTong((int) Math.ceil(propScore * equip.getTong()
* enchantWeightScoreFactor.getTongUp() / weightScore
/ enchantPropScoreFactor.getTongUp() * f)
* lv);
rabbet.setWu((int) Math.ceil(propScore * equip.getWu() * enchantWeightScoreFactor.getWuUp()
/ weightScore / enchantPropScoreFactor.getWuUp() * f)
* lv);
rabbet.setZhi((int) Math.ceil(propScore * equip.getZhi()
* enchantWeightScoreFactor.getZhiUp() / weightScore
/ enchantPropScoreFactor.getZhiUp() * f)
* lv);
rabbet.setAtk((int) Math.ceil(propScore * equip.getAtk()
* enchantWeightScoreFactor.getAtkUp() / weightScore
/ enchantPropScoreFactor.getAtkUp())
* lv);
rabbet.setDef((int) Math.ceil(propScore * equip.getDef()
* enchantWeightScoreFactor.getDefUp() / weightScore
/ enchantPropScoreFactor.getDefUp())
* lv);
rabbet.setMatk((int) Math.ceil(propScore * equip.getMatk()
* enchantWeightScoreFactor.getMatkUp() / weightScore
/ enchantPropScoreFactor.getMatkUp())
* lv);
rabbet.setMdef((int) Math.ceil(propScore * equip.getMdef()
* enchantWeightScoreFactor.getMdefUp() / weightScore
/ enchantPropScoreFactor.getMdefUp())
* lv);
rabbet.setHp((int) Math.ceil(propScore * equip.getHp() * enchantWeightScoreFactor.getHpUp()
/ weightScore / enchantPropScoreFactor.getHpUp())
* lv);
rabbet.setCritMagn((int) Math.ceil((propScore * equip.getCritMagn()
* enchantWeightScoreFactor.getCritMagnUp() / weightScore / enchantPropScoreFactor
.getCritMagnUp())) * lv);
rabbet.setCritRate((int) Math.ceil((propScore * equip.getCritRate()
* enchantWeightScoreFactor.getCritRateUp() / weightScore / enchantPropScoreFactor
.getCritRateUp())) * lv);
rabbet.setDecritRate((int) Math.ceil((propScore * equip.getDecritRate()
* enchantWeightScoreFactor.getDecritRateUp() / weightScore / enchantPropScoreFactor
.getDecritRateUp())) * lv);
rabbet.setDeparryRate((int) Math.ceil((propScore * equip.getDeparryRate()
* enchantWeightScoreFactor.getDeparryRateUp() / weightScore / enchantPropScoreFactor
.getDeparryRateUp()))
* lv);
rabbet.setParryRate((int) Math.ceil((propScore * equip.getParryRate()
* enchantWeightScoreFactor.getParryRateUp() / weightScore / enchantPropScoreFactor
.getParryRateUp())) * lv);
rabbet.setParryValue((int) Math.ceil(propScore * equip.getParryValue()
* enchantWeightScoreFactor.getParryValueUp() / weightScore
/ enchantPropScoreFactor.getParryValueUp())
* lv);
}
private double calculatorProps(EquipmentItemDobj equip, EnchantFactor enchant) {
double sumNumber = 0;
sumNumber += equip.getTong() * enchant.getTongUp();
sumNumber += equip.getWu() * enchant.getWuUp();
sumNumber += equip.getZhi() * enchant.getZhiUp();
sumNumber += equip.getAtk() * enchant.getAtkUp();
sumNumber += equip.getDef() * enchant.getDefUp();
sumNumber += equip.getMatk() * enchant.getMatkUp();
sumNumber += equip.getMdef() * enchant.getMdefUp();
sumNumber += equip.getHp() * enchant.getHpUp();
sumNumber += equip.getCritRate() * enchant.getCritRateUp();
sumNumber += equip.getCritMagn() * enchant.getCritMagnUp();
sumNumber += equip.getDecritRate() * enchant.getDecritRateUp();
sumNumber += equip.getDeparryRate() * enchant.getDeparryRateUp();
sumNumber += equip.getParryRate() * enchant.getParryRateUp();
sumNumber += equip.getParryValue() * enchant.getParryValueUp();
return sumNumber;
}
private Herofactor enchantStar(String eid) {
Herofactor herofactor = new Herofactor();
EquipmentItemDobj equip = itemProvider.getItem(eid);
starEnum starenum = Herofactor.starEnum.valueOf(equip.getStar().toString());
String str = null;
int level = 0;
JSONObject object;
switch (starenum) {
case X1:
herofactor
.setFactorNamber(Typhons.getDouble("typhon.domain.hero.X1.enchant", 0.75));
str = "enchantX1Exp";
level = 1;
break;
case X2:
herofactor
.setFactorNamber(Typhons.getDouble("typhon.domain.hero.X2.enchant", 0.45));
str = "enchantX2Exp";
level = 2;
break;
case X3:
herofactor
.setFactorNamber(Typhons.getDouble("typhon.domain.hero.X3.enchant", 0.35));
str = "enchantX3Exp";
level = 3;
break;
case X4:
herofactor.setFactorNamber(Typhons.getDouble("typhon.domain.hero.X3.enchant", 0.3));
str = "enchantX4Exp";
level = 4;
break;
case X5:
herofactor
.setFactorNamber(Typhons.getDouble("typhon.domain.hero.X5.enchant", 0.27));
str = "enchantX5Exp";
level = 5;
break;
}
for (int i = 0; i < level; i++) {
object = expLeveArray.getJSONObject(i);
herofactor.addExps(object.getIntValue(str));
}
herofactor.setLevel(level);
return herofactor;
}
private boolean levelLimit(int level, int levelLimit) {
return (level >= levelLimit);
}
private static class LotteryLimit {
int maxSoul;
int maxHero;
int soul;
int hero;
LotteryLimit(int maxSoul, int maxHero) {
this.maxSoul = maxSoul;
this.maxHero = maxHero;
}
boolean isMaxSoul() {
return (maxSoul != -1 && soul >= maxSoul);
}
boolean isMaxHero() {
return (maxHero != -1 && hero >= maxHero);
}
}
}