Maker disassembly info to MakerInfoProvider
MakerProcessor is such a mess...
This commit is contained in:
@@ -29,6 +29,7 @@ import config.YamlConfig;
|
|||||||
import constants.game.GameConstants;
|
import constants.game.GameConstants;
|
||||||
import constants.id.ItemId;
|
import constants.id.ItemId;
|
||||||
import constants.inventory.ItemConstants;
|
import constants.inventory.ItemConstants;
|
||||||
|
import database.maker.MakerDisassemblyInfo;
|
||||||
import database.maker.MakerInfoProvider;
|
import database.maker.MakerInfoProvider;
|
||||||
import database.maker.MakerReagent;
|
import database.maker.MakerReagent;
|
||||||
import net.packet.InPacket;
|
import net.packet.InPacket;
|
||||||
@@ -85,14 +86,14 @@ public class MakerProcessor {
|
|||||||
if (it != null && it.getItemId() == toCreate) {
|
if (it != null && it.getItemId() == toCreate) {
|
||||||
toDisassemble = toCreate;
|
toDisassemble = toCreate;
|
||||||
|
|
||||||
Pair<Integer, List<Pair<Integer, Integer>>> pair = generateDisassemblyInfo(toDisassemble);
|
Optional<MakerDisassemblyInfo> disassemblyInfo = infoProvider.getDisassemblyInfo(toDisassemble);
|
||||||
if (pair != null) {
|
if (disassemblyInfo.isEmpty()) {
|
||||||
recipe = MakerItemFactory.generateDisassemblyCrystalEntry(toDisassemble, pair.getLeft(), pair.getRight());
|
|
||||||
} else {
|
|
||||||
c.sendPacket(PacketCreator.serverNotice(1, ii.getName(toCreate) + " is unavailable for Monster Crystal disassembly."));
|
c.sendPacket(PacketCreator.serverNotice(1, ii.getName(toCreate) + " is unavailable for Monster Crystal disassembly."));
|
||||||
c.sendPacket(PacketCreator.makerEnableActions());
|
c.sendPacket(PacketCreator.makerEnableActions());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recipe = MakerItemFactory.generateDisassemblyCrystalEntry(toDisassemble, disassemblyInfo.get());
|
||||||
} else {
|
} else {
|
||||||
c.sendPacket(PacketCreator.serverNotice(1, "An unknown error occurred when trying to apply that item for disassembly."));
|
c.sendPacket(PacketCreator.serverNotice(1, "An unknown error occurred when trying to apply that item for disassembly."));
|
||||||
c.sendPacket(PacketCreator.makerEnableActions());
|
c.sendPacket(PacketCreator.makerEnableActions());
|
||||||
@@ -193,6 +194,7 @@ public class MakerProcessor {
|
|||||||
default:
|
default:
|
||||||
if (toDisassemble != -1) {
|
if (toDisassemble != -1) {
|
||||||
InventoryManipulator.removeFromSlot(c, InventoryType.EQUIP, (short) pos, (short) 1, false);
|
InventoryManipulator.removeFromSlot(c, InventoryType.EQUIP, (short) pos, (short) 1, false);
|
||||||
|
// TODO: fix disassembly being free. The fee is never applied.
|
||||||
} else {
|
} else {
|
||||||
for (Pair<Integer, Integer> pair : recipe.getReqItems()) {
|
for (Pair<Integer, Integer> pair : recipe.getReqItems()) {
|
||||||
c.getAbstractPlayerInteraction().gainItem(pair.getLeft(), (short) -pair.getRight(), false);
|
c.getAbstractPlayerInteraction().gainItem(pair.getLeft(), (short) -pair.getRight(), false);
|
||||||
@@ -308,18 +310,6 @@ public class MakerProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Pair<Integer, List<Pair<Integer, Integer>>> generateDisassemblyInfo(int itemId) {
|
|
||||||
int recvFee = ii.getMakerDisassembledFee(itemId);
|
|
||||||
if (recvFee > -1) {
|
|
||||||
List<Pair<Integer, Integer>> gains = ii.getMakerDisassembledItems(itemId);
|
|
||||||
if (!gains.isEmpty()) {
|
|
||||||
return new Pair<>(recvFee, gains);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getMakerSkillLevel(Character chr) {
|
private int getMakerSkillLevel(Character chr) {
|
||||||
return chr.getSkillLevel((chr.getJob().getId() / 1000) * 10000000 + 1007);
|
return chr.getSkillLevel((chr.getJob().getId() / 1000) * 10000000 + 1007);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -257,6 +257,10 @@ public class ItemId {
|
|||||||
public static final int ADVANCED_MONSTER_CRYSTAL_2 = 4260007;
|
public static final int ADVANCED_MONSTER_CRYSTAL_2 = 4260007;
|
||||||
public static final int ADVANCED_MONSTER_CRYSTAL_3 = 4260008;
|
public static final int ADVANCED_MONSTER_CRYSTAL_3 = 4260008;
|
||||||
|
|
||||||
|
public static boolean isMonsterCrystal(int itemId) {
|
||||||
|
return itemId / 10000 == 426;
|
||||||
|
}
|
||||||
|
|
||||||
// NPC weather (PQ)
|
// NPC weather (PQ)
|
||||||
public static final int NPC_WEATHER_GROWLIE = 5120016; // Henesys PQ
|
public static final int NPC_WEATHER_GROWLIE = 5120016; // Henesys PQ
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package database;
|
package database;
|
||||||
|
|
||||||
|
import database.maker.MakerIngredientRowMapper;
|
||||||
import database.maker.MakerReagentRowMapper;
|
import database.maker.MakerReagentRowMapper;
|
||||||
import database.maker.MakerRecipeRowMapper;
|
import database.maker.MakerRecipeRowMapper;
|
||||||
import database.note.NoteRowMapper;
|
import database.note.NoteRowMapper;
|
||||||
@@ -14,6 +15,7 @@ public final class JdbiConfig {
|
|||||||
return Jdbi.create(dataSource)
|
return Jdbi.create(dataSource)
|
||||||
.registerRowMapper(new NoteRowMapper())
|
.registerRowMapper(new NoteRowMapper())
|
||||||
.registerRowMapper(new MakerReagentRowMapper())
|
.registerRowMapper(new MakerReagentRowMapper())
|
||||||
.registerRowMapper(new MakerRecipeRowMapper());
|
.registerRowMapper(new MakerRecipeRowMapper())
|
||||||
|
.registerRowMapper(new MakerIngredientRowMapper());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import database.PgDatabaseConnection;
|
|||||||
import org.jdbi.v3.core.Handle;
|
import org.jdbi.v3.core.Handle;
|
||||||
import org.jdbi.v3.core.JdbiException;
|
import org.jdbi.v3.core.JdbiException;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public class MakerDao {
|
public class MakerDao {
|
||||||
@@ -41,4 +42,18 @@ public class MakerDao {
|
|||||||
throw new DaoException("Failed to get maker recipe with item id: %d".formatted(itemId), e);
|
throw new DaoException("Failed to get maker recipe with item id: %d".formatted(itemId), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<MakerIngredient> getIngredients(int recipeItemId) {
|
||||||
|
try (Handle handle = connection.getHandle()) {
|
||||||
|
return handle.createQuery("""
|
||||||
|
SELECT *
|
||||||
|
FROM maker_ingredient
|
||||||
|
WHERE maker_recipe = ?;""")
|
||||||
|
.bind(0, recipeItemId)
|
||||||
|
.mapTo(MakerIngredient.class)
|
||||||
|
.list();
|
||||||
|
} catch (JdbiException e) {
|
||||||
|
throw new DaoException("Failed to get maker ingredients for recipe item id %d".formatted(recipeItemId), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
6
src/main/java/database/maker/MakerDisassemblyInfo.java
Normal file
6
src/main/java/database/maker/MakerDisassemblyInfo.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package database.maker;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
public record MakerDisassemblyInfo(int fee, Collection<MakerIngredient> gainedItems) {
|
||||||
|
}
|
||||||
@@ -2,8 +2,10 @@ package database.maker;
|
|||||||
|
|
||||||
import com.github.benmanes.caffeine.cache.Cache;
|
import com.github.benmanes.caffeine.cache.Cache;
|
||||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
|
import constants.id.ItemId;
|
||||||
import net.jcip.annotations.ThreadSafe;
|
import net.jcip.annotations.ThreadSafe;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@ThreadSafe
|
@ThreadSafe
|
||||||
@@ -11,6 +13,7 @@ public class MakerInfoProvider {
|
|||||||
private final MakerDao makerDao;
|
private final MakerDao makerDao;
|
||||||
private final Cache<Integer, Optional<MakerReagent>> reagentCache = Caffeine.newBuilder().build();
|
private final Cache<Integer, Optional<MakerReagent>> reagentCache = Caffeine.newBuilder().build();
|
||||||
private final Cache<Integer, Optional<MakerRecipe>> recipeCache = Caffeine.newBuilder().build();
|
private final Cache<Integer, Optional<MakerRecipe>> recipeCache = Caffeine.newBuilder().build();
|
||||||
|
private final Cache<Integer, List<MakerIngredient>> ingredientsCache = Caffeine.newBuilder().build();
|
||||||
|
|
||||||
public MakerInfoProvider(MakerDao makerDao) {
|
public MakerInfoProvider(MakerDao makerDao) {
|
||||||
if (makerDao == null) {
|
if (makerDao == null) {
|
||||||
@@ -30,4 +33,31 @@ public class MakerInfoProvider {
|
|||||||
public Optional<Integer> getStimulant(int itemId) {
|
public Optional<Integer> getStimulant(int itemId) {
|
||||||
return getMakerRecipe(itemId).map(MakerRecipe::catalyst);
|
return getMakerRecipe(itemId).map(MakerRecipe::catalyst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<MakerIngredient> getIngredients(int recipeItemId) {
|
||||||
|
return ingredientsCache.get(recipeItemId, makerDao::getIngredients);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<MakerDisassemblyInfo> getDisassemblyInfo(int itemId) {
|
||||||
|
Optional<MakerRecipe> recipe = getMakerRecipe(itemId);
|
||||||
|
if (recipe.isEmpty()) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
int fee = calculateDisassemblyFee(recipe.get().mesoCost());
|
||||||
|
|
||||||
|
List<MakerIngredient> gainedItems = getIngredients(itemId).stream()
|
||||||
|
.filter(i -> ItemId.isMonsterCrystal(i.itemId()))
|
||||||
|
.map(i -> new MakerIngredient(i.itemId(), (short) (i.count() / 2)))
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
return Optional.of(new MakerDisassemblyInfo(fee, gainedItems));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int calculateDisassemblyFee(int creationCost) {
|
||||||
|
// cost is 13.6363~ % of the original value, trim by 1000.
|
||||||
|
float val = (float) (creationCost * 0.13636363636364);
|
||||||
|
int fee = (int) (val / 1000);
|
||||||
|
fee *= 1000;
|
||||||
|
return fee;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4
src/main/java/database/maker/MakerIngredient.java
Normal file
4
src/main/java/database/maker/MakerIngredient.java
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
package database.maker;
|
||||||
|
|
||||||
|
public record MakerIngredient(int itemId, short count) {
|
||||||
|
}
|
||||||
17
src/main/java/database/maker/MakerIngredientRowMapper.java
Normal file
17
src/main/java/database/maker/MakerIngredientRowMapper.java
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package database.maker;
|
||||||
|
|
||||||
|
import org.jdbi.v3.core.mapper.RowMapper;
|
||||||
|
import org.jdbi.v3.core.statement.StatementContext;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
public class MakerIngredientRowMapper implements RowMapper<MakerIngredient> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MakerIngredient map(ResultSet rs, StatementContext ctx) throws SQLException {
|
||||||
|
int itemId = rs.getInt("item_id");
|
||||||
|
short count = rs.getShort("count");
|
||||||
|
return new MakerIngredient(itemId, count);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2082,45 +2082,6 @@ public class ItemInformationProvider {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Pair<Integer, Integer>> getMakerDisassembledItems(Integer itemId) {
|
|
||||||
List<Pair<Integer, Integer>> items = new LinkedList<>();
|
|
||||||
|
|
||||||
try (Connection con = DatabaseConnection.getConnection();
|
|
||||||
PreparedStatement ps = con.prepareStatement("SELECT req_item, count FROM makerrecipedata WHERE itemid = ? AND req_item >= 4260000 AND req_item < 4270000")) {
|
|
||||||
ps.setInt(1, itemId);
|
|
||||||
|
|
||||||
try (ResultSet rs = ps.executeQuery()) {
|
|
||||||
while (rs.next()) {
|
|
||||||
items.add(new Pair<>(rs.getInt("req_item"), rs.getInt("count") / 2)); // return to the player half of the crystals needed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMakerDisassembledFee(Integer itemId) {
|
|
||||||
int fee = -1;
|
|
||||||
try (Connection con = DatabaseConnection.getConnection();
|
|
||||||
PreparedStatement ps = con.prepareStatement("SELECT req_meso FROM makercreatedata WHERE itemid = ?")) {
|
|
||||||
ps.setInt(1, itemId);
|
|
||||||
|
|
||||||
try (ResultSet rs = ps.executeQuery()) {
|
|
||||||
if (rs.next()) { // cost is 13.6363~ % of the original value, trim by 1000.
|
|
||||||
float val = (float) (rs.getInt("req_meso") * 0.13636363636364);
|
|
||||||
fee = (int) (val / 1000);
|
|
||||||
fee *= 1000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return fee;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> getWhoDrops(Integer itemId) {
|
public Set<String> getWhoDrops(Integer itemId) {
|
||||||
Set<String> list = new HashSet<>();
|
Set<String> list = new HashSet<>();
|
||||||
try (Connection con = DatabaseConnection.getConnection();
|
try (Connection con = DatabaseConnection.getConnection();
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ package server;
|
|||||||
|
|
||||||
import config.YamlConfig;
|
import config.YamlConfig;
|
||||||
import constants.inventory.EquipType;
|
import constants.inventory.EquipType;
|
||||||
|
import database.maker.MakerDisassemblyInfo;
|
||||||
import tools.Pair;
|
import tools.Pair;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -64,12 +65,10 @@ public class MakerItemFactory {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MakerItemCreateEntry generateDisassemblyCrystalEntry(int fromEquipid, int cost, List<Pair<Integer, Integer>> gains) { // equipment at specific position already taken
|
public static MakerItemCreateEntry generateDisassemblyCrystalEntry(int fromEquipid, MakerDisassemblyInfo disassemblyInfo) { // equipment at specific position already taken
|
||||||
MakerItemCreateEntry ret = new MakerItemCreateEntry(cost, 0, 1);
|
MakerItemCreateEntry ret = new MakerItemCreateEntry(disassemblyInfo.fee(), 0, 1);
|
||||||
ret.addReqItem(fromEquipid, 1);
|
ret.addReqItem(fromEquipid, 1);
|
||||||
for (Pair<Integer, Integer> p : gains) {
|
disassemblyInfo.gainedItems().forEach(i -> ret.addGainItem(i.itemId(), i.count()));
|
||||||
ret.addGainItem(p.getLeft(), p.getRight());
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user