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.
397 lines
10 KiB
397 lines
10 KiB
3 years ago
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||
|
// Magicbane Emulator Project © 2013 - 2022
|
||
|
// www.magicbane.com
|
||
|
|
||
|
|
||
|
package engine.objects;
|
||
|
|
||
|
import engine.exception.SerializationException;
|
||
|
import engine.gameManager.PowersManager;
|
||
|
import engine.net.ByteBufferWriter;
|
||
|
import engine.powers.EffectsBase;
|
||
|
import engine.powers.poweractions.AbstractPowerAction;
|
||
|
import org.pmw.tinylog.Logger;
|
||
|
|
||
|
import java.sql.ResultSet;
|
||
|
import java.sql.SQLException;
|
||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||
|
|
||
|
public class MobEquipment extends AbstractGameObject {
|
||
|
|
||
|
private static AtomicInteger equipCounter = new AtomicInteger(0);
|
||
|
private final ItemBase itemBase;
|
||
|
private int slot;
|
||
|
private int parentID;
|
||
|
|
||
|
//effects
|
||
|
private boolean enchanted;
|
||
|
private boolean isID = false;
|
||
|
private AbstractPowerAction prefix;
|
||
|
private AbstractPowerAction suffix;
|
||
|
private int pValue;
|
||
|
private int sValue;
|
||
|
private int magicValue;
|
||
|
|
||
|
private float dropChance = 0;
|
||
|
|
||
|
/**
|
||
|
* No Id Constructor
|
||
|
*/
|
||
|
public MobEquipment(ItemBase itemBase, int slot, int parentID) {
|
||
|
super(MobEquipment.getNewID());
|
||
|
this.itemBase = itemBase;
|
||
|
this.slot = slot;
|
||
|
this.parentID = parentID;
|
||
|
this.enchanted = false;
|
||
|
this.prefix = null;
|
||
|
this.suffix = null;
|
||
|
this.pValue = 0;
|
||
|
this.sValue = 0;
|
||
|
setMagicValue();
|
||
|
}
|
||
|
|
||
|
public MobEquipment(ItemBase itemBase, int slot, int parentID, String pIDString, String sIDString, int pValue, int sValue) {
|
||
|
super(MobEquipment.getNewID());
|
||
|
this.itemBase = itemBase;
|
||
|
this.slot = slot;
|
||
|
this.parentID = parentID;
|
||
|
|
||
|
//add effects
|
||
|
this.prefix = PowersManager.getPowerActionByIDString(pIDString);
|
||
|
this.suffix = PowersManager.getPowerActionByIDString(sIDString);
|
||
|
|
||
|
this.pValue = pValue;
|
||
|
this.sValue = sValue;
|
||
|
this.enchanted = this.prefix == null || this.suffix == null;
|
||
|
setMagicValue();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* ResultSet Constructor
|
||
|
*/
|
||
|
public MobEquipment(ResultSet rs) throws SQLException {
|
||
|
super(MobEquipment.getNewID());
|
||
|
int itemBaseID = rs.getInt("ItemID");
|
||
|
this.itemBase = ItemBase.getItemBase(itemBaseID);
|
||
|
this.slot = rs.getInt("slot");
|
||
|
this.parentID = rs.getInt("mobID");
|
||
|
setMagicValue();
|
||
|
}
|
||
|
|
||
|
|
||
|
public MobEquipment(int itemBaseID,float dropChance) {
|
||
|
super(MobEquipment.getNewID());
|
||
|
this.itemBase = ItemBase.getItemBase(itemBaseID);
|
||
|
|
||
|
if (this.itemBase != null)
|
||
|
this.slot = this.itemBase.getValidSlot();
|
||
|
else{
|
||
|
Logger.error("Failed to find Itembase for ID : " + itemBaseID);
|
||
|
this.slot = 0;
|
||
|
}
|
||
|
|
||
|
this.dropChance = dropChance;
|
||
|
|
||
|
this.parentID = 0;
|
||
|
setMagicValue();
|
||
|
}
|
||
|
|
||
|
public ItemBase getItemBase() {
|
||
|
return itemBase;
|
||
|
}
|
||
|
|
||
|
public int getSlot() {
|
||
|
return this.slot;
|
||
|
}
|
||
|
|
||
|
public void setSlot(int value) {
|
||
|
this.slot = value;
|
||
|
}
|
||
|
|
||
|
public static int getNewID() {
|
||
|
return MobEquipment.equipCounter.incrementAndGet();
|
||
|
}
|
||
|
|
||
|
public static void serializeForVendor(MobEquipment mobEquipment,ByteBufferWriter writer, float percent) throws SerializationException {
|
||
|
_serializeForClientMsg(mobEquipment,writer, false);
|
||
|
int baseValue = mobEquipment.itemBase.getBaseValue() + mobEquipment.itemBase.getMagicValue();
|
||
|
writer.putInt(mobEquipment.magicValue);
|
||
|
writer.putInt(mobEquipment.magicValue);
|
||
|
}
|
||
|
|
||
|
|
||
|
public static void serializeForClientMsg(MobEquipment mobEquipment,ByteBufferWriter writer) throws SerializationException {
|
||
|
_serializeForClientMsg(mobEquipment,writer, true);
|
||
|
}
|
||
|
|
||
|
public static void _serializeForClientMsg(MobEquipment mobEquipment,ByteBufferWriter writer, boolean useSlot) throws SerializationException {
|
||
|
|
||
|
if (useSlot)
|
||
|
writer.putInt(mobEquipment.slot);
|
||
|
writer.putInt(0); // Pad
|
||
|
writer.putInt(mobEquipment.itemBase.getUUID());
|
||
|
writer.putInt(mobEquipment.getObjectType().ordinal());
|
||
|
writer.putInt(mobEquipment.getObjectUUID());
|
||
|
|
||
|
// Unknown statics
|
||
|
for (int i = 0; i < 3; i++) {
|
||
|
writer.putInt(0); // Pad
|
||
|
}
|
||
|
for (int i = 0; i < 4; i++) {
|
||
|
writer.putInt(0x3F800000); // Static
|
||
|
}
|
||
|
for (int i = 0; i < 5; i++) {
|
||
|
writer.putInt(0); // Pad
|
||
|
}
|
||
|
for (int i = 0; i < 2; i++) {
|
||
|
writer.putInt(0xFFFFFFFF); // Static
|
||
|
}
|
||
|
|
||
|
writer.putInt(0);
|
||
|
|
||
|
writer.put((byte) 1); // End Datablock byte
|
||
|
writer.putInt(0); // Unknown. pad?
|
||
|
writer.put((byte) 1); // End Datablock byte
|
||
|
|
||
|
writer.putFloat(mobEquipment.itemBase.getDurability());
|
||
|
writer.putFloat(mobEquipment.itemBase.getDurability());
|
||
|
|
||
|
writer.put((byte) 1); // End Datablock byte
|
||
|
|
||
|
writer.putInt(0); // Pad
|
||
|
writer.putInt(0); // Pad
|
||
|
|
||
|
writer.putInt(mobEquipment.itemBase.getBaseValue());
|
||
|
writer.putInt(mobEquipment.magicValue);
|
||
|
|
||
|
serializeEffects(mobEquipment,writer);
|
||
|
|
||
|
writer.putInt(0x00000000);
|
||
|
|
||
|
//name color, think mobEquipment is where mobEquipment goes
|
||
|
if (mobEquipment.enchanted)
|
||
|
if (mobEquipment.isID)
|
||
|
writer.putInt(36);
|
||
|
else
|
||
|
writer.putInt(40);
|
||
|
else
|
||
|
writer.putInt(4);
|
||
|
|
||
|
writer.putInt(0);
|
||
|
writer.putInt(0); // Pad
|
||
|
writer.putInt(1);
|
||
|
writer.putShort((short) 0);
|
||
|
writer.put((byte) 0);
|
||
|
}
|
||
|
|
||
|
public final void setMagicValue() {
|
||
|
float value = 1;
|
||
|
if (itemBase != null)
|
||
|
value = itemBase.getBaseValue();
|
||
|
if (this.prefix != null) {
|
||
|
if (this.prefix.getEffectsBase() != null)
|
||
|
value += this.prefix.getEffectsBase().getValue();
|
||
|
if (this.prefix.getEffectsBase2() != null)
|
||
|
value += this.prefix.getEffectsBase2().getValue();
|
||
|
}
|
||
|
if (this.suffix != null) {
|
||
|
if (this.suffix.getEffectsBase() != null)
|
||
|
value += this.suffix.getEffectsBase().getValue();
|
||
|
if (this.suffix.getEffectsBase2() != null)
|
||
|
value += this.suffix.getEffectsBase2().getValue();
|
||
|
}
|
||
|
|
||
|
if (itemBase != null)
|
||
|
|
||
|
for (Integer token : itemBase.getBakedInStats().keySet()) {
|
||
|
|
||
|
EffectsBase effect = PowersManager.getEffectByToken(token);
|
||
|
|
||
|
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
|
||
|
if (apa.getEffectsBase() != null)
|
||
|
if (apa.getEffectsBase().getValue() > 0){
|
||
|
//System.out.println(apa.getEffectsBase().getValue());
|
||
|
value += apa.getEffectsBase().getValue();
|
||
|
}
|
||
|
|
||
|
|
||
|
if (apa.getEffectsBase2() != null)
|
||
|
value += apa.getEffectsBase2().getValue();
|
||
|
}
|
||
|
|
||
|
this.magicValue = (int) value;
|
||
|
}
|
||
|
|
||
|
public int getMagicValue() {
|
||
|
|
||
|
if (!this.isID) {
|
||
|
return itemBase.getBaseValue();
|
||
|
}
|
||
|
return this.magicValue;
|
||
|
}
|
||
|
|
||
|
|
||
|
public static void serializeEffects(MobEquipment mobEquipment,ByteBufferWriter writer) {
|
||
|
|
||
|
//skip sending effects if not IDed
|
||
|
if (!mobEquipment.isID) {
|
||
|
writer.putInt(0);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//handle effect count
|
||
|
int cnt = 0;
|
||
|
EffectsBase pre = null;
|
||
|
EffectsBase suf = null;
|
||
|
if (mobEquipment.prefix != null) {
|
||
|
pre = PowersManager.getEffectByIDString(mobEquipment.prefix.getIDString());
|
||
|
if (pre != null)
|
||
|
cnt++;
|
||
|
}
|
||
|
if (mobEquipment.suffix != null) {
|
||
|
suf = PowersManager.getEffectByIDString(mobEquipment.suffix.getIDString());
|
||
|
if (suf != null)
|
||
|
cnt++;
|
||
|
}
|
||
|
|
||
|
writer.putInt(cnt);
|
||
|
|
||
|
//serialize prefix
|
||
|
if (pre != null)
|
||
|
serializeEffect(mobEquipment,writer, pre, mobEquipment.pValue);
|
||
|
|
||
|
//serialize suffix
|
||
|
if (suf != null)
|
||
|
serializeEffect(mobEquipment,writer, suf, mobEquipment.sValue);
|
||
|
}
|
||
|
|
||
|
public static void serializeEffect(MobEquipment mobEquipment,ByteBufferWriter writer, EffectsBase eb, int rank) {
|
||
|
String name;
|
||
|
if (eb.isPrefix()) {
|
||
|
if (mobEquipment.itemBase == null)
|
||
|
name = eb.getName();
|
||
|
else
|
||
|
name = eb.getName() + ' ' + mobEquipment.itemBase.getName();
|
||
|
}
|
||
|
else if (eb.isSuffix()) {
|
||
|
if (mobEquipment.itemBase == null)
|
||
|
name = eb.getName();
|
||
|
else
|
||
|
name = mobEquipment.itemBase.getName() + ' ' + eb.getName();
|
||
|
}
|
||
|
else {
|
||
|
if (mobEquipment.itemBase == null)
|
||
|
name = "";
|
||
|
else
|
||
|
name = mobEquipment.itemBase.getName();
|
||
|
}
|
||
|
|
||
|
writer.putInt(eb.getToken());
|
||
|
writer.putInt(rank);
|
||
|
writer.putInt(1);
|
||
|
writer.put((byte) 1);
|
||
|
writer.putInt(mobEquipment.getObjectType().ordinal());
|
||
|
writer.putInt(mobEquipment.getObjectUUID());
|
||
|
writer.putString(name);
|
||
|
writer.putFloat(-1000f);
|
||
|
}
|
||
|
|
||
|
public void setPrefix(String pIDString, int pValue) {
|
||
|
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(pIDString);
|
||
|
if (apa != null) {
|
||
|
this.prefix = apa;
|
||
|
this.pValue = pValue;
|
||
|
} else
|
||
|
this.prefix = null;
|
||
|
|
||
|
this.enchanted = this.prefix != null || this.suffix != null;
|
||
|
|
||
|
setMagicValue();
|
||
|
}
|
||
|
|
||
|
public void setSuffix(String sIDString, int sValue) {
|
||
|
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(sIDString);
|
||
|
if (apa != null) {
|
||
|
this.suffix = apa;
|
||
|
this.sValue = sValue;
|
||
|
} else
|
||
|
this.suffix = null;
|
||
|
|
||
|
this.enchanted = this.prefix != null || this.suffix != null;
|
||
|
|
||
|
setMagicValue();
|
||
|
}
|
||
|
|
||
|
public void setIsID(boolean value) {
|
||
|
this.isID = value;
|
||
|
}
|
||
|
|
||
|
public boolean isID() {
|
||
|
return this.isID;
|
||
|
}
|
||
|
|
||
|
public void transferEnchants(Item item) {
|
||
|
if (this.prefix != null) {
|
||
|
String IDString = this.prefix.getIDString();
|
||
|
item.addPermanentEnchantment(IDString, this.pValue);
|
||
|
}
|
||
|
if (this.suffix != null) {
|
||
|
String IDString = this.suffix.getIDString();
|
||
|
item.addPermanentEnchantment(IDString, this.sValue);
|
||
|
}
|
||
|
if (this.isID)
|
||
|
item.setIsID(true);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Database
|
||
|
*/
|
||
|
@Override
|
||
|
public void updateDatabase() {
|
||
|
}
|
||
|
|
||
|
|
||
|
public void persistObject() {
|
||
|
PreparedStatementShared ps = null;
|
||
|
try {
|
||
|
ps = prepareStatement("INSERT INTO static_npc_mobequipment (`mobID`, `slot`, `itemID`) VALUES (?, ?, ?)");
|
||
|
ps.setInt(1, this.parentID, true);
|
||
|
ps.setInt(2, this.slot);
|
||
|
ps.setInt(3, this.itemBase.getUUID(), true);
|
||
|
ps.executeUpdate();
|
||
|
} catch (SQLException e) {
|
||
|
Logger.error( e.toString());
|
||
|
} finally {
|
||
|
ps.release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void removeObject(int UUID, int slot) {
|
||
|
PreparedStatementShared ps = null;
|
||
|
try {
|
||
|
ps = prepareStatement("DELETE FROM `static_npc_mobequipment` WHERE `mobID`=? AND slot=?");
|
||
|
ps.setInt(1, UUID);
|
||
|
ps.setInt(2, slot);
|
||
|
ps.executeUpdate();
|
||
|
} catch (SQLException e) {
|
||
|
Logger.error( e.toString());
|
||
|
} finally {
|
||
|
ps.release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public float getDropChance() {
|
||
|
return dropChance;
|
||
|
}
|
||
|
|
||
|
public void setDropChance(float dropChance) {
|
||
|
this.dropChance = dropChance;
|
||
|
}
|
||
|
}
|