Files
Server/src/engine/net/client/handlers/RepairMsgHandler.java
T

155 lines
5.5 KiB
Java
Raw Normal View History

2024-03-15 13:13:22 -04:00
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.net.client.handlers;
import engine.gameManager.DbManager;
import engine.gameManager.DispatchManager;
2024-03-15 13:13:22 -04:00
import engine.gameManager.SessionManager;
import engine.mbEnums;
import engine.mbEnums.DispatchChannel;
2024-03-15 13:13:22 -04:00
import engine.net.Dispatch;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.RepairMsg;
import engine.net.client.msg.UpdateGoldMsg;
import engine.objects.*;
import engine.server.MBServerStatics;
public class RepairMsgHandler extends AbstractClientMsgHandler {
public RepairMsgHandler() {
2024-05-12 11:55:12 -04:00
super();
2024-03-15 13:13:22 -04:00
}
@Override
2024-05-12 13:42:11 -04:00
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
2024-03-15 13:13:22 -04:00
PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
Dispatch dispatch;
RepairMsg repairMsg = (RepairMsg) baseMsg;
if (player == null)
return true;
NPC npc = NPC.getFromCache(repairMsg.getNPCID());
if (npc == null)
return true;
if (repairMsg.getMsgType() == 1) { //Open RepairObject Window
if (player.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
ErrorPopupMsg.sendErrorPopup(player, 14);
return true;
}
//send open repair window response
repairMsg.setRepairWindowAck(npc);
dispatch = Dispatch.borrow(player, repairMsg);
DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
2024-03-15 13:13:22 -04:00
} else if (repairMsg.getMsgType() == 0) { //Request RepairObject
2024-03-18 10:01:29 -04:00
CharacterItemManager itemMan = player.charItemManager;
2024-03-15 13:13:22 -04:00
if (itemMan == null)
return true;
Item gold = itemMan.getGoldInventory();
if (gold == null)
return true;
Item toRepair = Item.getFromCache(repairMsg.getItemID());
if (toRepair == null)
return true;
if (toRepair.name.toUpperCase().contains("GLASS"))
return true;
//make sure item is in player's inventory or equipment
if (!itemMan.inventoryContains(toRepair) && !itemMan.equippedContains(toRepair))
return true;
//make sure item is damaged and not destroyed
2024-03-25 05:25:09 -04:00
short dur = (short) toRepair.combat_health_current;
2024-03-25 05:29:15 -04:00
short max = (short) toRepair.template.combat_health_full;
2024-03-15 13:13:22 -04:00
//account for durability modifications
float durMod = toRepair.getBonusPercent(mbEnums.ModType.Durability, mbEnums.SourceType.None);
2024-03-15 13:13:22 -04:00
max *= (1 + (durMod * 0.01f));
if (dur >= max || dur < 1) {
//redundancy message to clear item from window in client
2024-03-25 05:25:09 -04:00
toRepair.setCombat_health_current(max);
2024-03-15 13:13:22 -04:00
repairMsg.setupRepairAck(max - dur);
dispatch = Dispatch.borrow(player, repairMsg);
DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
2024-03-15 13:13:22 -04:00
return true;
}
//TODO get cost to repair
int cost = (int) ((max - dur) * 80.1);
Building building = (!npc.isStatic()) ? npc.getBuilding() : null;
if (building != null)
if (building.getProtectionState().equals(mbEnums.ProtectionState.NPC))
2024-03-15 13:13:22 -04:00
building = null;
if (building != null && (building.getStrongboxValue() + cost) > building.getMaxGold()) {
ErrorPopupMsg.sendErrorPopup(player, 206);
return true;
}
2024-03-18 10:01:29 -04:00
if (player.charItemManager.getGoldInventory().getNumOfItems() - cost < 0)
2024-03-15 13:13:22 -04:00
return true;
2024-03-18 10:01:29 -04:00
if (player.charItemManager.getGoldInventory().getNumOfItems() - cost > MBServerStatics.PLAYER_GOLD_LIMIT)
2024-03-15 13:13:22 -04:00
return true;
if (!itemMan.buyFromNPC(building, cost, cost)) {
ErrorPopupMsg.sendErrorPopup(player, 128);
return true;
}
//update player's goldItem count
UpdateGoldMsg ugm = new UpdateGoldMsg(player);
ugm.configure();
dispatch = Dispatch.borrow(player, ugm);
DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
2024-03-15 13:13:22 -04:00
//update durability to database
if (!DbManager.ItemQueries.SET_DURABILITY(toRepair, max))
return true;
//repair the item
2024-03-25 05:25:09 -04:00
toRepair.setCombat_health_current(max);
2024-03-15 13:13:22 -04:00
//send repair msg
repairMsg.setupRepairAck(max - dur);
dispatch = Dispatch.borrow(player, repairMsg);
DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
2024-03-15 13:13:22 -04:00
}
return true;
}
}