package org.skfiy.typhon.spi.hero;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.inject.Inject;
import org.skfiy.typhon.AbstractComponent;
import org.skfiy.typhon.Typhons;
import org.skfiy.typhon.domain.Bag;
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.HeroItem;
import org.skfiy.typhon.packet.EnchantPacket;
import org.skfiy.typhon.packet.ExclusivePacket;
import org.skfiy.typhon.packet.Packet;
import org.skfiy.typhon.packet.PacketError;
import org.skfiy.typhon.packet.SingleValue;
import org.skfiy.typhon.session.SessionUtils;
import org.skfiy.typhon.spi.store.Commoditied;
import org.skfiy.typhon.util.ComponentUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class HeroExclusiveProvider extends AbstractComponent {
protected static final Random RANDOM = new Random();
// 打造专属武器属性加成
private final Map<String, ExclusiveBuild> exclusiveBuilds = new HashMap<>();
// 打造消耗的物品
private final List<ExclusiveBuildLimit> exclusiveBuildLimits = new ArrayList<>();
// 专属武器初始属性
private final Map<String, ExclusiveWeapon> exclusiveWeapons = new HashMap<>();
// 强化消耗物品
private final List<ExclusiveBuildLimit> strengCosts = new ArrayList<>();
// 洗练消耗
private final List<ExclusiveBuildLimit> exclusiveWashs = new ArrayList<>();
@Inject
private HeroProvider heroProvider;
@Override
protected void doInit() {
JSONArray array;
array = JSONArray.parseArray(ComponentUtils.readDataFile("weapons_build.json"));
ExclusiveBuild build = null;
for (int i = 0; i < array.size(); i++) {
build = array.getObject(i, ExclusiveBuild.class);
exclusiveBuilds.put(build.getId(), build);
}
array = JSONArray.parseArray(ComponentUtils.readDataFile("exclusive_weapons.json"));
ExclusiveWeapon weapon = null;
for (int i = 0; i < array.size(); i++) {
weapon = array.getObject(i, ExclusiveWeapon.class);
exclusiveWeapons.put(weapon.getId(), weapon);
}
exclusiveBuildLimits.addAll(JSONArray.parseArray(
ComponentUtils.readDataFile("weapons_build_property.json"),
ExclusiveBuildLimit.class));
strengCosts.addAll(JSONArray.parseArray(
ComponentUtils.readDataFile("weapons_intensify.json"), ExclusiveBuildLimit.class));
exclusiveWashs.addAll(JSONArray.parseArray(
ComponentUtils.readDataFile("weapons_wash.json"), ExclusiveBuildLimit.class));
}
@Override
protected void doDestroy() {}
@Override
protected void doReload() {}
public void exclusiveRabber(SingleValue packet) {
Player player = SessionUtils.getPlayer();
Bag heroBag = player.getHeroBag();
ExclusiveWeapon weapon = exclusiveWeapons.get((String) packet.getVal());
HeroItem heroItem = heroBag.findNode(weapon.getHeroId()).getItem();
if (heroItem.getWeaponsRabbets() != null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.no_exist);
error.setText("WeaponsRabbets is exist");
player.getSession().write(error);
return;
}
Rabbet rabbet = new Rabbet();
rabbet.setAtk(weapon.getAtk());
rabbet.setMatk(weapon.getMatk());
rabbet.setDef(weapon.getDef());
rabbet.setMdef(weapon.getMdef());
rabbet.setHp(weapon.getHp());
heroItem.setWeaponsRabbets(rabbet);
heroItem.setWeaponsEnchant(new Rabbet());
heroItem.setWeaponsBuild(new Rabbet());
heroItem.setWeaponsStreng(new Rabbet());
heroProvider.calculatorPowerGuess(heroItem);
player.getBag().decrementTotal((String) packet.getVal(), 1);
player.getSession().write(Packet.createResult(packet));
}
public void exclusiveBuild(SingleValue packet) {
Player player = SessionUtils.getPlayer();
Normal normal = player.getNormal();
Bag heroBag = player.getHeroBag();
ExclusiveBuild build = exclusiveBuilds.get((String) packet.getVal());
HeroItem heroItem =
heroBag.findNode(exclusiveWeapons.get(build.getId()).getHeroId()).getItem();
List<Commoditied> commoditieds = new ArrayList<>();
if (heroItem == null || heroItem.getWeaponsRabbets() == null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.no_exist);
error.setText("WeaponsRabbets no exist");
player.getSession().write(error);
return;
} else {
if (heroItem.getBuildLevel() >= 5) {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.level_limit);
error.setText("WeaponsBuild is top class");
player.getSession().write(error);
return;
}
ExclusiveBuildLimit buildLimit = exclusiveBuildLimits.get(heroItem.getBuildLevel());
if (normal.getLevel() < buildLimit.getLevellimit()) {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.level_limit);
error.setText("WeaponsBuild Level Limit");
player.getSession().write(error);
return;
} else {
if (cost(player, buildLimit)) {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.item_not_found);
error.setText("WeaponsBuild CostItem is not enough");
player.getSession().write(error);
return;
}
}
buildInformation(heroItem, build, (String) packet.getVal());
if (heroItem.getWeaponsEnchant() != null) {
commoditieds =
heroProvider.enchantReturn1(heroItem.getWeaponsEnchant().getExpSum());
heroItem.setWeaponsEnchant(new Rabbet());
player.getBag().decrementTotal(build.getSoulId(),
exclusiveBuildLimits.get(heroItem.getBuildLevel() - 1).getSoulCounts());
}
}
SingleValue result = new SingleValue();
Packet.assignResult(packet, result);
result.setVal(commoditieds);
player.getSession().write(result);
}
private void buildInformation(HeroItem heroItem, ExclusiveBuild build, String eid) {
Rabbet buildRabbet = heroItem.getWeaponsBuild();
Rabbet rabbet = heroItem.getWeaponsStreng();
if (rabbet == null) {
rabbet = new Rabbet();
}
ExclusiveWeapon weapon = exclusiveWeapons.get(eid);
ExclusiveBuildInformation information = build.getAttribute().get(heroItem.getBuildLevel());
if (information.getName().equals("atk")) {
buildRabbet.setAtk(information.getNumber()
+ (int) (information.getCount() * (rabbet.getAtk() + weapon.getAtk()))
+ buildRabbet.getAtk());
}
if (information.getName().equals("matk")) {
buildRabbet.setMatk(information.getNumber()
+ (int) (information.getCount() * (rabbet.getMatk() + weapon.getMatk()))
+ buildRabbet.getMatk());
}
if (information.getName().equals("def")) {
buildRabbet.setDef(information.getNumber()
+ (int) (information.getCount() * (rabbet.getDef() + weapon.getDef()))
+ buildRabbet.getDef());
}
if (information.getName().equals("mdef")) {
buildRabbet.setMdef(information.getNumber()
+ (int) (information.getCount() * (rabbet.getMdef() + weapon.getMdef()))
+ buildRabbet.getMdef());
}
if (information.getName().equals("hp")) {
buildRabbet.setHp(information.getNumber()
+ (int) (information.getCount() * (rabbet.getHp() + weapon.getHp()))
+ buildRabbet.getHp());
}
if (information.getName().equals("critMagn")) {
buildRabbet.setCritMagn(information.getNumber()
+ (int) (information.getCount() * rabbet.getCritMagn())
+ buildRabbet.getCritMagn());
}
if (information.getName().equals("critRate")) {
buildRabbet.setCritRate(information.getNumber()
+ (int) (information.getCount() * rabbet.getCritRate())
+ buildRabbet.getCritRate());
}
if (information.getName().equals("decritRate")) {
buildRabbet.setDecritRate(information.getNumber()
+ (int) (information.getCount() * rabbet.getDecritRate())
+ buildRabbet.getDecritRate());
}
if (information.getName().equals("deparryRate")) {
buildRabbet.setDeparryRate(information.getNumber()
+ (int) (information.getCount() * rabbet.getDeparryRate())
+ buildRabbet.getDeparryRate());
}
if (information.getName().equals("parryRate")) {
buildRabbet.setParryRate(information.getNumber()
+ (int) (information.getCount() * rabbet.getParryRate())
+ buildRabbet.getParryRate());
}
if (information.getName().equals("parryValue")) {
buildRabbet.setParryValue(information.getNumber()
+ (int) (information.getCount() * rabbet.getParryValue())
+ buildRabbet.getParryValue());
}
heroItem.setWeaponsBuild(buildRabbet);
heroItem.setBuildLevel(heroItem.getBuildLevel() + 1);
heroProvider.calculatorPowerGuess(heroItem);
}
public void exclusiveStreng(SingleValue packet) {
Player player = SessionUtils.getPlayer();
Normal normal = player.getNormal();
Bag heroBag = player.getHeroBag();
ExclusiveWeapon weapon = exclusiveWeapons.get((String) packet.getVal());
HeroItem heroItem = heroBag.findNode(weapon.getHeroId()).getItem();
Rabbet rabbet = heroItem.getWeaponsStreng();
if (rabbet == null) {
rabbet = new Rabbet();
}
ExclusiveBuildLimit strengCost = strengCosts.get(heroItem.getStrengLevel());
if (normal.getLevel() < strengCost.getLevellimit()) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.level_limit);
error.setText("WeaponsBuild Level Limit");
player.getSession().write(error);
return;
} else {
if (cost(player, strengCost)) {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.item_not_found);
error.setText("WeaponsBuild CostItem is not enough");
player.getSession().write(error);
return;
}
}
switch ((heroItem.getStrengLevel() + 1) % 3) {
case 1:
rabbet.setAtk(rabbet.getAtk() + weapon.getAtkUp());
rabbet.setMatk(rabbet.getMatk() + weapon.getMatkUp());
break;
case 2:
rabbet.setDef(rabbet.getDef() + weapon.getDefUp());
rabbet.setMdef(rabbet.getMdef() + weapon.getMdefUp());
break;
case 0:
rabbet.setHp(rabbet.getHp() + weapon.getHpUp());
break;
}
heroItem.setWeaponsStreng(rabbet);
heroItem.setStrengLevel(heroItem.getStrengLevel() + 1);
heroProvider.calculatorPowerGuess(heroItem);
player.getSession().write(Packet.createResult(packet));
}
public void exclusiveEnchem(EnchantPacket packet) {
Player player = SessionUtils.getPlayer();
HeroItem heroItem = player.getHeroBag().findNode(packet.getPos()).getItem();
if (heroItem.getWeaponsRabbets() == null) {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.item_not_found);
error.setText("the hore is not equipment");
player.getSession().write(error);
return;
}
Rabbet rabbet =
heroProvider.enchant(heroItem, player, packet, packet.getEid(),
heroItem.getWeaponsEnchant());
if (rabbet != null) {
heroItem.setWeaponsEnchant(rabbet);
heroProvider.calculatorPowerGuess(heroItem);
}
player.getSession().write(Packet.createResult(packet));
}
public boolean limit(int level, String eid, HeroItem heroItem) {
if (exclusiveBuilds.containsKey(eid)) {
return level >= heroItem.getBuildLevel();
}
return false;
}
public void exclusiveEnchemOnce(EnchantPacket packet) {
Player player = SessionUtils.getPlayer();
HeroItem heroItem = player.getHeroBag().findNode(packet.getPos()).getItem();
if (heroItem.getWeaponsRabbets() == 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));
}
Rabbet rabbet =
heroProvider.start(expAdd, heroItem, packet.getEid(), heroItem.getWeaponsEnchant());
if (rabbet != null) {
heroItem.setWeaponsEnchant(rabbet);
heroProvider.calculatorPowerGuess(heroItem);
JSONObject object = new JSONObject();
object.put("place", "ExclusiveEnchemOnce");
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));
}
public void exclusiveWash(ExclusivePacket packet) {
Player player = SessionUtils.getPlayer();
Bag heroBag = player.getHeroBag();
ExclusiveWeapon weapon = exclusiveWeapons.get(packet.getEid());
HeroItem item = heroBag.findNode(weapon.getHeroId()).getItem();
Rabbet rabbet = item.getWeaponsRabbets();
Rabbet strengRabbet = item.getWeaponsStreng();
Rabbet newWash = new Rabbet();
if (strengRabbet == null) {
strengRabbet = new Rabbet();
}
if (rabbet == null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.no_exist);
error.setText("WeaponsRabbets no exist");
player.getSession().write(error);
return;
}
ExclusiveBuildLimit exclusiveCost = exclusiveWashs.get(packet.getLevel());
int factor = 0;
if (!cost(player, exclusiveCost)) {
factor = exclusiveCost.getFactor();
} else {
PacketError error =
PacketError.createResult(packet, PacketError.Condition.item_not_found);
error.setText("WeaponsBuild CostItem is not enough");
player.getSession().write(error);
return;
}
do {
newWash.setAtk((RANDOM.nextInt(10) - 5) * factor);
newWash.setMatk((RANDOM.nextInt(10) - 5) * factor);
newWash.setDef((RANDOM.nextInt(10) - 5) * factor);
newWash.setMdef((RANDOM.nextInt(10) - 5) * factor);
newWash.setHp((RANDOM.nextInt(40) - 20) * factor);
} while (!washBoolean(rabbet, newWash, strengRabbet, weapon, item.getBuildLevel()));
player.getInvisible().setRabbet(newWash);
SingleValue result = new SingleValue();
Packet.assignResult(packet, result);
result.setVal(newWash);
player.getSession().write(result);
}
public void exclusiveEnhancement2(SingleValue packet) {
Player player = SessionUtils.getPlayer();
Bag heroBag = player.getHeroBag();
ExclusiveWeapon weapon = exclusiveWeapons.get((String) packet.getVal());
HeroItem heroItem = heroBag.findNode(weapon.getHeroId()).getItem();
Rabbet rabbet = heroItem.getWeaponsRabbets();
Rabbet rabbetWash = player.getInvisible().getRabbet();
rabbet.setAtk(Math.max(rabbet.getAtk() + rabbetWash.getAtk(), weapon.getAtk()));
rabbet.setMatk(Math.max(rabbet.getMatk() + rabbetWash.getMatk(), weapon.getMatk()));
rabbet.setDef(Math.max(rabbet.getDef() + rabbetWash.getDef(), weapon.getDef()));
rabbet.setMdef(Math.max(rabbet.getMdef() + rabbetWash.getMdef(), weapon.getMdef()));
rabbet.setHp(Math.max(rabbet.getHp() + rabbetWash.getHp(), weapon.getHp()));
heroItem.setWeaponsRabbets(rabbet);
heroProvider.calculatorPowerGuess(heroItem);
player.getSession().write(Packet.createResult(packet));
}
private boolean cost(Player player, ExclusiveBuildLimit cost) {
Bag bag = player.getBag();
boolean bool = false;
if (cost.getCostType().equals("D")) {
JSONObject object = new JSONObject();
object.put("place", "ExclusiveBuild/Streng/Wash");
SessionUtils.decrementDiamond(cost.getCounts(), object.toString());
} else {
SessionUtils.decrementCopper(cost.getCounts());
}
if (!cost.getCostItems().isEmpty()) {
for (ExclusiveBuildInformation information : cost.getCostItems()) {
if (!player.getBag().decrementTotal(bag.findNode(information.getName()),
information.getNumber())) {
bool = true;
break;
}
}
}
return bool;
}
private boolean washBoolean(Rabbet oldRabbet, Rabbet newRabbet, Rabbet strengRabbet,
ExclusiveWeapon weapon, int level) {
return oldRabbet.getAtk() + newRabbet.getAtk() - weapon.getAtk() <= weapon.getAtk()
+ weapon.getAtkUp() * Math.max(level / 3, 0)
&& oldRabbet.getMatk() + newRabbet.getMatk() - weapon.getMatk() <= weapon.getMatk()
+ weapon.getMatkUp() * Math.max(level / 3, 0)
&& oldRabbet.getDef() + newRabbet.getDef() - weapon.getDef() <= weapon.getDef()
+ weapon.getDefUp() * Math.max(level / 3, 0)
&& oldRabbet.getMdef() + newRabbet.getMdef() - weapon.getMdef() <= weapon.getMdef()
+ weapon.getMdefUp() * Math.max(level / 3, 0)
&& oldRabbet.getHp() + newRabbet.getHp() - weapon.getHp() <= weapon.getHp()
+ weapon.getHpUp() * Math.max(level / 3, 0);
}
}