forked from MagicBane/Server
MagicBot
8 months ago
4 changed files with 298 additions and 265 deletions
@ -0,0 +1,289 @@
@@ -0,0 +1,289 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
package engine.net.client.handlers; |
||||
|
||||
import engine.Enum; |
||||
import engine.exception.MsgSendException; |
||||
import engine.gameManager.ChatManager; |
||||
import engine.gameManager.DbManager; |
||||
import engine.gameManager.PowersManager; |
||||
import engine.gameManager.SessionManager; |
||||
import engine.net.Dispatch; |
||||
import engine.net.DispatchMessage; |
||||
import engine.net.client.ClientConnection; |
||||
import engine.net.client.msg.ClientNetMsg; |
||||
import engine.net.client.msg.ErrorPopupMsg; |
||||
import engine.net.client.msg.TrainMsg; |
||||
import engine.net.client.msg.TrainerInfoMsg; |
||||
import engine.objects.*; |
||||
import engine.powers.PowersBase; |
||||
import engine.server.MBServerStatics; |
||||
import org.pmw.tinylog.Logger; |
||||
|
||||
import java.util.concurrent.ConcurrentHashMap; |
||||
|
||||
public class TrainMsgHandler extends AbstractClientMsgHandler { |
||||
|
||||
public TrainMsgHandler() { |
||||
super(TrainMsg.class); |
||||
} |
||||
|
||||
@Override |
||||
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { |
||||
|
||||
TrainMsg msg = (TrainMsg) baseMsg; |
||||
origin.getPlayerCharacter().recalculate(); |
||||
PlayerCharacter playerCharacter = SessionManager.getPlayerCharacter(origin); |
||||
Dispatch dispatch; |
||||
|
||||
if (playerCharacter == null) |
||||
return true; |
||||
|
||||
NPC npc = NPC.getFromCache(msg.npcID); |
||||
|
||||
if (npc == null) |
||||
return true; |
||||
|
||||
if (origin.trainLock.tryLock()) { |
||||
try { |
||||
Item gold = playerCharacter.charItemManager.getGoldInventory(); |
||||
|
||||
if (gold == null) |
||||
return true; |
||||
|
||||
if (!gold.validForInventory(origin, playerCharacter, playerCharacter.charItemManager)) |
||||
return true; |
||||
|
||||
boolean canTrain = false; |
||||
if (msg.isSkill) { |
||||
|
||||
//Get skill
|
||||
SkillsBase sb = DbManager.SkillsBaseQueries.GET_BASE_BY_TOKEN(msg.token); |
||||
ConcurrentHashMap<String, CharacterSkill> skills = playerCharacter.getSkills(); |
||||
|
||||
if (sb == null || skills == null) |
||||
return true; |
||||
|
||||
CharacterSkill sk = skills.get(sb.getName()); |
||||
|
||||
if (sk == null) |
||||
return true; |
||||
|
||||
if (sk.getSkillsBase().getToken() == 40661438) { |
||||
int maxValue = 15; |
||||
|
||||
|
||||
if (MaxSkills.MaxSkillsSet.get(252647) != null) |
||||
for (MaxSkills maxSkills : MaxSkills.MaxSkillsSet.get(252647)) { |
||||
if (maxSkills.getSkillToken() != sk.getToken()) |
||||
continue; |
||||
|
||||
if (maxSkills.getSkillLevel() > npc.getLevel()) |
||||
continue; |
||||
maxValue += maxSkills.getMaxSkillPercent(); |
||||
} |
||||
if (maxValue > sk.getModifiedAmountBeforeMods()) { |
||||
canTrain = true; |
||||
} |
||||
|
||||
} |
||||
if (canTrain == false) |
||||
if (npc.getContract() != null && npc.getContract().getExtraRune() != 0) { |
||||
int maxValue = 15; |
||||
|
||||
|
||||
if (MaxSkills.MaxSkillsSet.get(npc.getContract().getExtraRune()) != null) |
||||
for (MaxSkills maxSkills : MaxSkills.MaxSkillsSet.get(npc.getContract().getExtraRune())) { |
||||
if (maxSkills.getSkillToken() != sk.getToken()) |
||||
continue; |
||||
|
||||
if (maxSkills.getSkillLevel() > npc.getLevel()) |
||||
continue; |
||||
maxValue += maxSkills.getMaxSkillPercent(); |
||||
} |
||||
if (maxValue > sk.getModifiedAmountBeforeMods()) { |
||||
canTrain = true; |
||||
} |
||||
|
||||
|
||||
} |
||||
if (canTrain == false) { |
||||
int maxValue = 15; |
||||
if (MaxSkills.MaxSkillsSet.get(npc.getContractID()) != null) |
||||
for (MaxSkills maxSkills : MaxSkills.MaxSkillsSet.get(npc.getContractID())) { |
||||
if (maxSkills.getSkillToken() != sk.getToken()) |
||||
continue; |
||||
|
||||
if (maxSkills.getSkillLevel() > npc.getLevel()) |
||||
continue; |
||||
maxValue += maxSkills.getMaxSkillPercent(); |
||||
} |
||||
if (maxValue > sk.getModifiedAmountBeforeMods()) { |
||||
canTrain = true; |
||||
} |
||||
} |
||||
|
||||
if (canTrain == false) { |
||||
int maxValue = 15; |
||||
if (MaxSkills.MaxSkillsSet.get(npc.getContract().getClassID()) != null) |
||||
for (MaxSkills maxSkills : MaxSkills.MaxSkillsSet.get(npc.getContract().getClassID())) { |
||||
if (maxSkills.getSkillToken() != sk.getToken()) |
||||
continue; |
||||
|
||||
if (maxSkills.getSkillLevel() > npc.getLevel()) |
||||
continue; |
||||
maxValue += maxSkills.getMaxSkillPercent(); |
||||
} |
||||
if (maxValue > sk.getModifiedAmountBeforeMods()) { |
||||
canTrain = true; |
||||
} |
||||
} |
||||
|
||||
if (canTrain == false) { |
||||
int maxValue = 15; |
||||
if (MaxSkills.MaxSkillsSet.get(npc.extraRune2) != null) |
||||
for (MaxSkills maxSkills : MaxSkills.MaxSkillsSet.get(npc.getContract().getClassID())) { |
||||
if (maxSkills.getSkillToken() != sk.getToken()) |
||||
continue; |
||||
|
||||
if (maxSkills.getSkillLevel() > npc.getLevel()) |
||||
continue; |
||||
maxValue += maxSkills.getMaxSkillPercent(); |
||||
} |
||||
if (maxValue > sk.getModifiedAmountBeforeMods()) { |
||||
canTrain = true; |
||||
} |
||||
} |
||||
|
||||
if (canTrain == false) { |
||||
ChatManager.chatSystemError(playerCharacter, "NPC cannot train that skill any higher"); |
||||
return true; |
||||
} |
||||
|
||||
float cost = sk.getTrainingCost(playerCharacter, npc); |
||||
float profitCost = cost * npc.getSellPercent(playerCharacter); |
||||
|
||||
profitCost += .5f; |
||||
|
||||
if (profitCost > playerCharacter.charItemManager.getGoldInventory().getNumOfItems()) |
||||
return true; |
||||
|
||||
Building building = npc.getBuilding(); |
||||
|
||||
if (building != null && building.getProtectionState().equals(Enum.ProtectionState.NPC)) |
||||
building = null; |
||||
|
||||
if (building != null && building.getStrongboxValue() + (profitCost - cost) > building.getMaxGold()) { |
||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 206); |
||||
return true; |
||||
} |
||||
|
||||
if (playerCharacter.charItemManager.getGoldInventory().getNumOfItems() - profitCost < 0) |
||||
return true; |
||||
|
||||
if (playerCharacter.charItemManager.getGoldInventory().getNumOfItems() - profitCost > MBServerStatics.PLAYER_GOLD_LIMIT) |
||||
return true; |
||||
|
||||
//attempt to train
|
||||
|
||||
if (sk.train(playerCharacter)) { |
||||
playerCharacter.charItemManager.buyFromNPC(building, (int) profitCost, (int) (profitCost - cost)); |
||||
|
||||
dispatch = Dispatch.borrow(playerCharacter, msg); |
||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); |
||||
|
||||
//update trainer window
|
||||
|
||||
if (npc != null) { |
||||
TrainerInfoMsg tim = new TrainerInfoMsg(msg.npcType, msg.npcID, npc.getSellPercent(playerCharacter)); |
||||
tim.setTrainPercent(npc.getSellPercent(playerCharacter)); |
||||
dispatch = Dispatch.borrow(playerCharacter, tim); |
||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); |
||||
} |
||||
} |
||||
|
||||
} else { |
||||
//Get Power
|
||||
int token = msg.token; |
||||
|
||||
if (MBServerStatics.POWERS_DEBUG) { |
||||
ChatManager.chatSayInfo(playerCharacter, "Training Power: " + |
||||
Integer.toHexString(msg.token) + " (" + msg.token + ')'); |
||||
System.out.println("Training Power: " + |
||||
Integer.toHexString(msg.token) + " (" + msg.token + ')'); |
||||
} |
||||
|
||||
PowersBase pb = PowersManager.getPowerByToken(token); |
||||
ConcurrentHashMap<Integer, CharacterPower> powers = playerCharacter.getPowers(); |
||||
|
||||
if (pb == null || powers == null) |
||||
return true; |
||||
|
||||
if (pb.isWeaponPower) |
||||
return true; |
||||
|
||||
CharacterPower cp = null; |
||||
|
||||
if (powers.containsKey(token)) |
||||
cp = powers.get(token); |
||||
|
||||
if (cp == null) |
||||
return true; |
||||
|
||||
//attempt to train
|
||||
float cost = (int) cp.getTrainingCost(playerCharacter, npc); |
||||
float profitCost = cost * npc.getSellPercent(playerCharacter); |
||||
|
||||
profitCost += .5f; |
||||
|
||||
if (profitCost > playerCharacter.charItemManager.getGoldInventory().getNumOfItems()) |
||||
return true; |
||||
|
||||
Building building = npc.getBuilding(); |
||||
|
||||
if (building != null && building.getProtectionState().equals(Enum.ProtectionState.NPC)) |
||||
building = null; |
||||
|
||||
if (building != null && building.getStrongboxValue() + (profitCost - cost) > building.getMaxGold()) { |
||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 206); |
||||
return true; |
||||
} |
||||
|
||||
if (cp.train(playerCharacter)) { |
||||
|
||||
if (!playerCharacter.charItemManager.buyFromNPC(building, (int) profitCost, (int) (profitCost - cost))) |
||||
ChatManager.chatSystemError(playerCharacter, "Failed to Withdrawl gold from inventory. Contact CCR"); |
||||
|
||||
//train succeeded
|
||||
|
||||
dispatch = Dispatch.borrow(playerCharacter, msg); |
||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); |
||||
|
||||
//update trainer window
|
||||
|
||||
if (npc != null) { |
||||
TrainerInfoMsg tim = new TrainerInfoMsg(msg.npcType, msg.npcID, npc.getSellPercent(playerCharacter)); |
||||
tim.setTrainPercent(npc.getSellPercent(playerCharacter)); |
||||
dispatch = Dispatch.borrow(playerCharacter, tim); |
||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); |
||||
} |
||||
} |
||||
} |
||||
} catch (Exception e) { |
||||
Logger.error(e); |
||||
} finally { |
||||
origin.trainLock.unlock(); |
||||
} |
||||
|
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue