Files
sweetgum-server/src/main/java/server/MakerItemFactory.java
2021-09-09 23:27:38 +02:00

212 lines
7.2 KiB
Java

/*
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
the Free Software Foundation. You may not use, modify or distribute
this program under any other version of the GNU Affero General Public
License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package server;
import config.YamlConfig;
import constants.inventory.EquipType;
import tools.Pair;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* @author Jay Estrella, Ronan
*/
public class MakerItemFactory {
private static final ItemInformationProvider ii = ItemInformationProvider.getInstance();
public static MakerItemCreateEntry getItemCreateEntry(int toCreate, int stimulantid, Map<Integer, Short> reagentids) {
MakerItemCreateEntry makerEntry = ii.getMakerItemEntry(toCreate);
if (makerEntry.isInvalid()) {
return makerEntry;
}
// THEY DECIDED FOR SOME BIZARRE PATTERN ON THE FEE THING, ALMOST RANDOMIZED.
if (stimulantid != -1) {
makerEntry.addCost(getMakerStimulantFee(toCreate));
}
if (!reagentids.isEmpty()) {
for (Entry<Integer, Short> r : reagentids.entrySet()) {
makerEntry.addCost((getMakerReagentFee(toCreate, ((r.getKey() % 10) + 1))) * r.getValue());
}
}
makerEntry.trimCost(); // "commit" the real cost of the recipe.
return makerEntry;
}
public static MakerItemCreateEntry generateLeftoverCrystalEntry(int fromLeftoverid, int crystalId) {
MakerItemCreateEntry ret = new MakerItemCreateEntry(0, 0, 1);
ret.addReqItem(fromLeftoverid, 100);
ret.addGainItem(crystalId, 1);
return ret;
}
public static MakerItemCreateEntry generateDisassemblyCrystalEntry(int fromEquipid, int cost, List<Pair<Integer, Integer>> gains) { // equipment at specific position already taken
MakerItemCreateEntry ret = new MakerItemCreateEntry(cost, 0, 1);
ret.addReqItem(fromEquipid, 1);
for (Pair<Integer, Integer> p : gains) {
ret.addGainItem(p.getLeft(), p.getRight());
}
return ret;
}
private static double getMakerStimulantFee(int itemid) {
if (YamlConfig.config.server.USE_MAKER_FEE_HEURISTICS) {
EquipType et = EquipType.getEquipTypeById(itemid);
int eqpLevel = ii.getEquipLevelReq(itemid);
switch (et) {
case CAP:
return 1145.736246 * Math.exp(0.03336832546 * eqpLevel);
case LONGCOAT:
return 2117.469118 * Math.exp(0.03355349137 * eqpLevel);
case SHOES:
return 1218.624674 * Math.exp(0.0342266043 * eqpLevel);
case GLOVES:
return 2129.531152 * Math.exp(0.03421778102 * eqpLevel);
case COAT:
return 1770.630579 * Math.exp(0.03359768677 * eqpLevel);
case PANTS:
return 1442.98837 * Math.exp(0.03444783295 * eqpLevel);
case SHIELD:
return 6312.40136 * Math.exp(0.0237929527 * eqpLevel);
default: // weapons
return 4313.581428 * Math.exp(0.03147837094 * eqpLevel);
}
} else {
return 14000;
}
}
private static double getMakerReagentFee(int itemid, int reagentLevel) {
if (YamlConfig.config.server.USE_MAKER_FEE_HEURISTICS) {
EquipType et = EquipType.getEquipTypeById(itemid);
int eqpLevel = ii.getEquipLevelReq(itemid);
switch (et) {
case CAP:
return 5592.01613 * Math.exp(0.02914576018 * eqpLevel) * reagentLevel;
case LONGCOAT:
return 3405.23441 * Math.exp(0.03413001038 * eqpLevel) * reagentLevel;
case SHOES:
return 2115.697484 * Math.exp(0.0354881705 * eqpLevel) * reagentLevel;
case GLOVES:
return 4684.040894 * Math.exp(0.03166500585 * eqpLevel) * reagentLevel;
case COAT:
return 2955.89017 * Math.exp(0.0339948456 * eqpLevel) * reagentLevel;
case PANTS:
return 1774.722181 * Math.exp(0.03854321409 * eqpLevel) * reagentLevel;
case SHIELD:
return 12014.11296 * Math.exp(0.02185471162 * eqpLevel) * reagentLevel;
default: // weapons
return 4538.650247 * Math.exp(0.0371980303 * eqpLevel) * reagentLevel;
}
} else {
return 8000 * reagentLevel;
}
}
public static class MakerItemCreateEntry {
private final int reqLevel;
private final int reqMakerLevel;
private double cost;
private int reqCost;
private final List<Pair<Integer, Integer>> reqItems = new ArrayList<>(); // itemId / amount
private final List<Pair<Integer, Integer>> gainItems = new ArrayList<>(); // itemId / amount
public MakerItemCreateEntry(int cost, int reqLevel, int reqMakerLevel) {
this.cost = cost;
this.reqLevel = reqLevel;
this.reqMakerLevel = reqMakerLevel;
}
public MakerItemCreateEntry(MakerItemCreateEntry mi) {
this.cost = mi.cost;
this.reqLevel = mi.reqLevel;
this.reqMakerLevel = mi.reqMakerLevel;
reqItems.addAll(mi.reqItems);
gainItems.addAll(mi.gainItems);
}
public List<Pair<Integer, Integer>> getReqItems() {
return reqItems;
}
public List<Pair<Integer, Integer>> getGainItems() {
return gainItems;
}
public int getReqLevel() {
return reqLevel;
}
public int getReqSkillLevel() {
return reqMakerLevel;
}
public int getCost() {
return reqCost;
}
public void addCost(double amount) {
cost += amount;
}
protected void addReqItem(int itemId, int amount) {
reqItems.add(new Pair<>(itemId, amount));
}
protected void addGainItem(int itemId, int amount) {
gainItems.add(new Pair<>(itemId, amount));
}
public void trimCost() {
reqCost = (int) (cost / 1000);
reqCost *= 1000;
}
public boolean isInvalid() { // thanks Rohenn, Wh1SK3Y for noticing some items not getting checked properly
return reqLevel < 0;
}
}
}