forked from MagicBane/Server
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.
135 lines
5.3 KiB
135 lines
5.3 KiB
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . |
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· |
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ |
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ |
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ |
|
// 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.job.JobContainer; |
|
import engine.job.JobScheduler; |
|
import engine.jobs.FinishSummonsJob; |
|
import engine.net.client.ClientConnection; |
|
import engine.net.client.msg.ClientNetMsg; |
|
import engine.net.client.msg.ErrorPopupMsg; |
|
import engine.net.client.msg.RecvSummonsMsg; |
|
import engine.objects.BaseClass; |
|
import engine.objects.PlayerCharacter; |
|
import engine.objects.PromotionClass; |
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
public class RecvSummonsMsgHandler extends AbstractClientMsgHandler { |
|
|
|
public RecvSummonsMsgHandler() { |
|
super(RecvSummonsMsg.class); |
|
} |
|
|
|
@Override |
|
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { |
|
|
|
PlayerCharacter playerCharacter = origin.getPlayerCharacter(); |
|
|
|
// Member variable declaration |
|
|
|
RecvSummonsMsg msg; |
|
|
|
// Member variable assignment |
|
|
|
msg = (RecvSummonsMsg) baseMsg; |
|
|
|
if (playerCharacter == null) |
|
return true; |
|
|
|
PlayerCharacter source = PlayerCharacter.getFromCache(msg.getSourceID()); |
|
|
|
if (source == null) |
|
return true; |
|
|
|
long tooLate = playerCharacter.getSummoner(source.getObjectUUID()); |
|
|
|
if (tooLate < System.currentTimeMillis()) { |
|
ChatManager.chatInfoError(playerCharacter, "You waited too long to " + (msg.accepted() ? "accept" : "decline") + " the summons."); |
|
playerCharacter.removeSummoner(source.getObjectUUID()); |
|
return true; |
|
} |
|
|
|
if (playerCharacter.getBonuses() != null && playerCharacter.getBonuses().getBool(Enum.ModType.BlockedPowerType, Enum.SourceType.SUMMON)) { |
|
ErrorPopupMsg.sendErrorMsg(playerCharacter, "You have been blocked from receiving summons!"); |
|
ErrorPopupMsg.sendErrorMsg(source, "Target is blocked from receiving summons!"); |
|
playerCharacter.removeSummoner(source.getObjectUUID()); |
|
return true; |
|
} |
|
|
|
playerCharacter.removeSummoner(source.getObjectUUID()); |
|
|
|
// Handle Accepting or Denying a summons. |
|
// set timer based on summon type. |
|
|
|
boolean wentThrough = false; |
|
|
|
if (msg.accepted()) // summons accepted, let's move the player if within time |
|
if (source.isAlive()) { |
|
|
|
//make sure summons handled in time |
|
ConcurrentHashMap<String, JobContainer> timers; |
|
timers = playerCharacter.getTimers(); |
|
|
|
if (timers != null && timers.containsKey("Summon")) |
|
timers.get("Summon").cancelJob(); |
|
|
|
// get time to wait before summons goes through |
|
|
|
BaseClass base = source.baseClass; |
|
PromotionClass promo = source.getPromotionClass(); |
|
int duration; |
|
|
|
//determine if in combat with another player |
|
|
|
//comment out this block to disable combat timer |
|
// if (lastAttacked < 60000) { |
|
// if (pc.inSafeZone()) //player in safe zone, no need for combat timer |
|
// combat = false; |
|
// else if (source.inSafeZone()) //summoner in safe zone, apply combat timer |
|
// combat = true; |
|
// else if ((source.getLoc().distance2D(pc.getLoc())) > 6144f) |
|
// combat = true; //more than 1.5x width of zone, not tactical summons |
|
// } |
|
|
|
if (promo != null && promo.getObjectUUID() == 2519) |
|
duration = 10000; // Priest summons, 10 seconds |
|
else if (base != null && base.getObjectUUID() == 2501) |
|
duration = 15000; // Healer Summons, 15 seconds |
|
else |
|
duration = 45000; // Belgosh Summons, 45 seconds |
|
|
|
// Teleport to summoners location |
|
|
|
FinishSummonsJob fsj = new FinishSummonsJob(source, playerCharacter); |
|
JobContainer jc = JobScheduler.getInstance().scheduleJob(fsj, |
|
duration); |
|
|
|
if (timers != null) |
|
timers.put("Summon", jc); |
|
|
|
wentThrough = true; |
|
} |
|
|
|
// Summons failed |
|
if (!wentThrough) // summons refused. Let's be nice and reset recycle timer |
|
{ |
|
// Send summons refused Message |
|
ErrorPopupMsg.sendErrorPopup(source, 29); |
|
// recycle summons power |
|
//finishRecycleTime(428523680, source, true); |
|
} |
|
|
|
return true; |
|
} |
|
|
|
} |