Public Repository for the Magicbane Shadowbane Emulator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
6.8 KiB

// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.objects;
import engine.gameManager.DbManager;
import engine.gameManager.PowersManager;
import engine.powers.PowersBase;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.ConcurrentHashMap;
public class PowerReq extends AbstractGameObject implements Comparable<PowerReq> {
private static ArrayList<PowerReq> powersForAll = new ArrayList<>();
private PowersBase powersBase;
private int token;
private short level;
private ConcurrentHashMap<Integer, Byte> powerReqs;
private ConcurrentHashMap<Integer, Byte> skillReqs;
private static ConcurrentHashMap<Integer, ArrayList<PowerReq>> runePowers = fillRunePowers();
/**
* No Table ID Constructor
*/
public PowerReq(PowersBase powersBase, short level, ConcurrentHashMap<Integer, Byte> powerReqs, ConcurrentHashMap<Integer, Byte> skillReqs) {
super();
this.powersBase = powersBase;
this.level = level;
this.powerReqs = powerReqs;
this.skillReqs = skillReqs;
if (this.powersBase != null)
this.token = this.powersBase.getToken();
else
this.token = 0;
}
/**
* Normal Constructor
*/
public PowerReq(PowersBase powersBase, short level, ConcurrentHashMap<Integer, Byte> powerReqs, ConcurrentHashMap<Integer, Byte> skillReqs, int newUUID) {
super(newUUID);
this.powersBase = powersBase;
this.level = level;
this.powerReqs = powerReqs;
this.skillReqs = skillReqs;
if (this.powersBase != null)
this.token = this.powersBase.getToken();
else
this.token = 0;
}
/**
* ResultSet Constructor
*/
public PowerReq(ResultSet rs) throws SQLException {
super(rs);
this.token = rs.getInt("powerToken");
this.powersBase = PowersManager.getPowerByToken(this.token);
this.level = rs.getShort("level");
int type = rs.getInt("type");
this.powerReqs = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
this.skillReqs = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
if (type == 1)
this.skillReqs.put(rs.getInt("requiredToken"), rs.getByte("requiredAmount"));
else if (type == 2)
this.powerReqs.put(rs.getInt("requiredToken"), rs.getByte("requiredAmount"));
}
public static ArrayList<PowerReq> getPowerReqsForRune(int id) {
// if (PowerReq.runePowers == null)
// fillRunePowers();
if (PowerReq.runePowers.containsKey(id))
return PowerReq.runePowers.get(id);
return new ArrayList<>();
}
public static ConcurrentHashMap<Integer, ArrayList<PowerReq>> fillRunePowers() {
PowerReq.runePowers = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_power_powerrequirement")) {
ResultSet rs = preparedStatement.executeQuery();
if (PowerReq.runePowers.size() > 0) {
return PowerReq.runePowers;
}
while (rs.next()) {
ArrayList<PowerReq> runePR = null;
int runeID = rs.getInt("runeID");
int token = rs.getInt("powerToken");
if (PowerReq.runePowers.containsKey(runeID))
runePR = PowerReq.runePowers.get(runeID);
else {
runePR = new ArrayList<>();
PowerReq.runePowers.put(runeID, runePR);
}
boolean found = false;
for (PowerReq pr : runePR) {
if (pr.token == token) {
int type = rs.getInt("type");
if (type == 1)
pr.addSkill(rs.getInt("requiredToken"), rs.getByte("requiredAmount"));
else
pr.addPower(rs.getInt("requiredToken"), rs.getByte("requiredAmount"));
found = true;
}
}
if (!found) {
PowerReq pr = new PowerReq(rs);
runePR.add(pr);
}
}
rs.close();
//order the lists by level so prerequisites are met
for (ArrayList<PowerReq> runePR : PowerReq.runePowers.values()) {
Collections.sort(runePR);
}
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode(), e);
}
return PowerReq.runePowers;
}
/*
* Getters
*/
public PowersBase getPowersBase() {
if (this.powersBase == null) {
this.powersBase = PowersManager.getPowerByToken(this.token);
}
return this.powersBase;
}
public short getLevel() {
return this.level;
}
public ConcurrentHashMap<Integer, Byte> getPowerReqs() {
return this.powerReqs;
}
public ConcurrentHashMap<Integer, Byte> getSkillReqs() {
return this.skillReqs;
}
public int getToken() {
return this.token;
}
private void addPower(int token, byte amount) {
this.powerReqs.put(token, amount);
}
private void addSkill(int token, byte amount) {
this.skillReqs.put(token, amount);
}
/*
* Database
*/
@Override
public int compareTo(PowerReq n) throws ClassCastException {
if (n.level == this.level)
return 0;
else if (this.level > n.level)
return 1;
else
return -1;
}
@Override
public void updateDatabase() {
}
}