|
|
|
package engine.net.client.handlers;
|
|
|
|
|
|
|
|
import engine.Enum;
|
|
|
|
import engine.Enum.GuildHistoryType;
|
|
|
|
import engine.InterestManagement.RealmMap;
|
|
|
|
import engine.exception.MsgSendException;
|
|
|
|
import engine.gameManager.*;
|
|
|
|
import engine.job.JobScheduler;
|
|
|
|
import engine.jobs.TeleportJob;
|
|
|
|
import engine.math.Vector3fImmutable;
|
|
|
|
import engine.net.Dispatch;
|
|
|
|
import engine.net.DispatchMessage;
|
|
|
|
import engine.net.client.ClientConnection;
|
|
|
|
import engine.net.client.msg.*;
|
|
|
|
import engine.objects.*;
|
|
|
|
import engine.powers.PowersBase;
|
|
|
|
import engine.server.MBServerStatics;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @Author:
|
|
|
|
* @Summary: Processes a variety of windows the client can open
|
|
|
|
* such as realm blessings and warehouse deposits.
|
|
|
|
*/
|
|
|
|
|
|
|
|
public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|
|
|
|
|
|
|
public MerchantMsgHandler() {
|
|
|
|
super(MerchantMsg.class);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void requestSwearAsSubGuild(MerchantMsg msg, ClientConnection origin, PlayerCharacter player, NPC npc) {
|
|
|
|
|
|
|
|
boolean Disabled = true;
|
|
|
|
|
|
|
|
if (Disabled) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "Swearing to Safeholds have been temporary disabled."); //Cannot sub as errant guild.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (player.getGuild().isEmptyGuild()) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "You do not belong to a guild!"); //Cannot sub as errant guild.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (player.getGuild().getNation() != null && !player.getGuild().getNation().isEmptyGuild()) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "You already belong to a nation!"); //Cannot sub as errant guild.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (player.getGuild().getGuildLeaderUUID() != player.getObjectUUID()) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "You must be a Guild Leader to Swear your guild as a Sub Guild!"); //Cannot sub as errant guild.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!GuildStatusController.isGuildLeader(player.getGuildStatus())) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "You must be a Guild Leader to Swear your guild as a Sub Guild!"); //Cannot sub as errant guild.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!npc.getGuild().isNPCGuild()) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "Runemaster does not belong to a safehold!"); //Cannot sub as errant guild.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (npc.getGuild().getRepledgeMin() > player.getLevel()) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "You are too low of a level to sub to this guild!"); //Cannot sub as errant guild.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (npc.getGuild().getRepledgeMax() < 75) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "Runemaster Guild Cannot Swear in your guild!"); //Cannot sub as errant guild.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!DbManager.GuildQueries.UPDATE_PARENT(player.getGuild().getObjectUUID(), npc.getGuild().getObjectUUID())) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "A Serious error has occured. Please post details for to ensure transaction integrity");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
GuildManager.updateAllGuildBinds(player.getGuild(), npc.getGuild().getOwnedCity());
|
|
|
|
|
|
|
|
|
|
|
|
//update Guild state.
|
|
|
|
player.getGuild().setNation(npc.getGuild());
|
|
|
|
GuildManager.updateAllGuildTags(player.getGuild());
|
|
|
|
|
|
|
|
//update state twice, errant to petitioner, to sworn.
|
|
|
|
player.getGuild().upgradeGuildState(false);//to petitioner
|
|
|
|
player.getGuild().upgradeGuildState(false);//to sworn
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void requestHermitBlessing(MerchantMsg msg, ClientConnection origin, PlayerCharacter player, NPC npc) {
|
|
|
|
|
|
|
|
Guild guild;
|
|
|
|
Realm realm;
|
|
|
|
City city;
|
|
|
|
Building tol;
|
|
|
|
|
|
|
|
// Validate player can obtain blessing
|
|
|
|
|
|
|
|
if (GuildStatusController.isGuildLeader(player.getGuildStatus()) == false) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 173); // You must be the leader of a guild to receive a blessing
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
guild = player.getGuild();
|
|
|
|
city = guild.getOwnedCity();
|
|
|
|
|
|
|
|
if (city == null) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 179); // Only landed guilds may claim a territory
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
tol = city.getTOL();
|
|
|
|
|
|
|
|
if (tol.getRank() != 7) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 181); // Your tree must be rank 7 before claiming a territory
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
realm = RealmMap.getRealmForCity(city);
|
|
|
|
|
|
|
|
if (realm.getCanBeClaimed() == false) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (realm.isRuled() == true) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Everything should be good, apply boon for this hermit
|
|
|
|
|
|
|
|
PowersManager.applyPower(player, player, player.getLoc(), getPowerforHermit(npc).getToken(), 40, false);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void requestBoon(MerchantMsg msg, ClientConnection origin, PlayerCharacter player, NPC npc) {
|
|
|
|
|
|
|
|
Building shrineBuilding;
|
|
|
|
Shrine shrine;
|
|
|
|
|
|
|
|
if (npc.getGuild() != player.getGuild())
|
|
|
|
return;
|
|
|
|
|
|
|
|
shrineBuilding = npc.getBuilding();
|
|
|
|
|
|
|
|
if (shrineBuilding == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (shrineBuilding.getBlueprint() != null && shrineBuilding.getBlueprint().getBuildingGroup() != engine.Enum.BuildingGroup.SHRINE)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (shrineBuilding.getRank() == -1)
|
|
|
|
return;
|
|
|
|
|
|
|
|
shrine = Shrine.shrinesByBuildingUUID.get(shrineBuilding.getObjectUUID());
|
|
|
|
|
|
|
|
if (shrine == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (shrine.getFavors() == 0) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 172);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
//already haz boon.
|
|
|
|
|
|
|
|
if (player.containsEffect(shrine.getShrineType().getPowerToken())) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 199);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Shrine.canTakeFavor(player, shrine))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (!shrine.takeFavor(player))
|
|
|
|
return;
|
|
|
|
|
|
|
|
PowersBase shrinePower = PowersManager.getPowerByToken(shrine.getShrineType().getPowerToken());
|
|
|
|
|
|
|
|
if (shrinePower == null) {
|
|
|
|
ChatManager.chatSystemError(player, "FAILED TO APPLY POWER!");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int rank = shrine.getRank();
|
|
|
|
//R8 trees always get atleast rank 2 boons. rank uses index, where 0 is first place, 1 is second, etc...
|
|
|
|
if (shrineBuilding.getCity() != null && shrineBuilding.getCity().getTOL() != null && shrineBuilding.getCity().getTOL().getRank() == 8)
|
|
|
|
if (rank != 0)
|
|
|
|
rank = 1;
|
|
|
|
int trains = 40 - (rank * 10);
|
|
|
|
if (trains < 0)
|
|
|
|
trains = 0;
|
|
|
|
|
|
|
|
//System.out.println(trains);
|
|
|
|
PowersManager.applyPower(player, player, player.getLoc(), shrinePower.getToken(), trains, false);
|
|
|
|
ChatManager.chatGuildInfo(player.getGuild(), player.getName() + " has recieved a boon costing " + 1 + " point of favor.");
|
|
|
|
shrineBuilding.addEffectBit(1000000 << 2);
|
|
|
|
shrineBuilding.updateEffects();
|
|
|
|
|
|
|
|
//remove the effect so players loading shrines dont see the effect go off.
|
|
|
|
shrineBuilding.removeEffectBit(1000000 << 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void teleportRepledgeScreen(MerchantMsg msg, ClientConnection origin, PlayerCharacter pc, boolean isTeleport, NPC npc) {
|
|
|
|
|
|
|
|
Dispatch dispatch;
|
|
|
|
TeleportRepledgeListMsg trlm;
|
|
|
|
|
|
|
|
//verify npc is runemaster
|
|
|
|
|
|
|
|
Contract contract = npc.getContract();
|
|
|
|
|
|
|
|
if (contract == null || !contract.isRuneMaster())
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (!isTeleport)
|
|
|
|
trlm = new TeleportRepledgeListMsg(pc, false);
|
|
|
|
else
|
|
|
|
trlm = new TeleportRepledgeListMsg(pc, true);
|
|
|
|
|
|
|
|
trlm.configure();
|
|
|
|
|
|
|
|
dispatch = Dispatch.borrow(pc, trlm);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void teleportRepledge(MerchantMsg msg, ClientConnection origin, PlayerCharacter player, boolean isTeleport, NPC npc) {
|
|
|
|
|
|
|
|
//verify npc is runemaster
|
|
|
|
|
|
|
|
Contract contract = npc.getContract();
|
|
|
|
Dispatch dispatch;
|
|
|
|
|
|
|
|
if (contract == null || !contract.isRuneMaster())
|
|
|
|
return;
|
|
|
|
|
|
|
|
//get city to teleport/repledge to and verify valid
|
|
|
|
|
|
|
|
ArrayList<City> cities;
|
|
|
|
|
|
|
|
City targetCity = null;
|
|
|
|
|
|
|
|
if (isTeleport)
|
|
|
|
cities = City.getCitiesToTeleportTo(player);
|
|
|
|
else
|
|
|
|
cities = City.getCitiesToRepledgeTo(player);
|
|
|
|
for (City city : cities) {
|
|
|
|
if (city.getObjectUUID() == msg.getCityID()) {
|
|
|
|
targetCity = city;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (targetCity == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
//verify level required to teleport or repledge
|
|
|
|
|
|
|
|
Guild toGuild = targetCity.getGuild();
|
|
|
|
|
|
|
|
if (toGuild != null)
|
|
|
|
if (isTeleport) {
|
|
|
|
if (player.getLevel() < toGuild.getTeleportMin() || player.getLevel() > toGuild.getTeleportMax())
|
|
|
|
return;
|
|
|
|
} else if (player.getLevel() < toGuild.getRepledgeMin() || player.getLevel() > toGuild.getRepledgeMax())
|
|
|
|
return;
|
|
|
|
|
|
|
|
boolean joinedGuild = false;
|
|
|
|
|
|
|
|
//if repledge, reguild the player
|
|
|
|
|
|
|
|
if (!isTeleport)
|
|
|
|
joinedGuild = GuildManager.joinGuild(player, targetCity.getGuild(), targetCity.getObjectUUID(), GuildHistoryType.JOIN);
|
|
|
|
|
|
|
|
int time;
|
|
|
|
|
|
|
|
if (!isTeleport) //repledge
|
|
|
|
time = MBServerStatics.REPLEDGE_TIME_IN_SECONDS;
|
|
|
|
else
|
|
|
|
time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
|
|
|
|
|
|
|
|
//resend message
|
|
|
|
msg.setTeleportTime(time);
|
|
|
|
|
|
|
|
if ((!isTeleport && joinedGuild) || (isTeleport)) {
|
|
|
|
|
|
|
|
dispatch = Dispatch.borrow(player, msg);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
|
|
|
}
|
|
|
|
|
|
|
|
//teleport player to city
|
|
|
|
|
|
|
|
Vector3fImmutable teleportLoc;
|
|
|
|
|
|
|
|
if (targetCity.getTOL().getRank() == 8)
|
|
|
|
teleportLoc = targetCity.getTOL().getStuckLocation();
|
|
|
|
else
|
|
|
|
teleportLoc = Vector3fImmutable.getRandomPointOnCircle(targetCity.getTOL().getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
|
|
|
|
|
|
|
|
if (time > 0) {
|
|
|
|
//TODO add timer to teleport
|
|
|
|
TeleportJob tj = new TeleportJob(player, npc, teleportLoc, origin, true);
|
|
|
|
JobScheduler.getInstance().scheduleJob(tj, time * 1000);
|
|
|
|
} else if (joinedGuild) {
|
|
|
|
player.teleport(teleportLoc);
|
|
|
|
player.setSafeMode();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static PowersBase getPowerforHermit(NPC npc) {
|
|
|
|
|
|
|
|
int contractID;
|
|
|
|
PowersBase power;
|
|
|
|
Contract contract;
|
|
|
|
|
|
|
|
contract = npc.getContract();
|
|
|
|
contractID = contract.getContractID();
|
|
|
|
power = null;
|
|
|
|
|
|
|
|
switch (contractID) {
|
|
|
|
case 435579:
|
|
|
|
power = PowersManager.getPowerByIDString("BLS-POWER");
|
|
|
|
break;
|
|
|
|
case 435580:
|
|
|
|
power = PowersManager.getPowerByIDString("BLS-FORTUNE");
|
|
|
|
break;
|
|
|
|
case 435581:
|
|
|
|
power = PowersManager.getPowerByIDString("BLS-WISDOM");
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
return power;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static boolean isHermit(NPC npc) {
|
|
|
|
|
|
|
|
int contractID;
|
|
|
|
boolean retValue = false;
|
|
|
|
|
|
|
|
contractID = npc.getContractID();
|
|
|
|
|
|
|
|
switch (contractID) {
|
|
|
|
case 435579:
|
|
|
|
case 435580:
|
|
|
|
case 435581:
|
|
|
|
retValue = true;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return retValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
|
|
|
|
|
|
|
|
// Member variable declaration
|
|
|
|
|
|
|
|
MerchantMsg msg;
|
|
|
|
PlayerCharacter player;
|
|
|
|
NPC npc;
|
|
|
|
int msgType;
|
|
|
|
Building warehouse;
|
|
|
|
Dispatch dispatch;
|
|
|
|
|
|
|
|
// Member variable assignment
|
|
|
|
|
|
|
|
player = SessionManager.getPlayerCharacter(origin);
|
|
|
|
msg = (MerchantMsg) baseMsg;
|
|
|
|
npc = NPC.getNPC(msg.getNPCID());
|
|
|
|
|
|
|
|
// Early exit if something goes awry
|
|
|
|
|
|
|
|
if ((player == null) || (npc == null))
|
|
|
|
return true;
|
|
|
|
|
|
|
|
// Player must be within talking range
|
|
|
|
|
|
|
|
if (player.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 14);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Process application protocol message
|
|
|
|
|
|
|
|
msgType = msg.getType();
|
|
|
|
|
|
|
|
switch (msgType) {
|
|
|
|
case 3:
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
|
|
|
|
dispatch = Dispatch.borrow(player, msg);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
|
|
|
requestSwearAsSubGuild(msg, origin, player, npc);
|
|
|
|
break;
|
|
|
|
case 10:
|
|
|
|
teleportRepledgeScreen(msg, origin, player, false, npc);
|
|
|
|
break;
|
|
|
|
case 11:
|
|
|
|
teleportRepledge(msg, origin, player, false, npc);
|
|
|
|
break;
|
|
|
|
case 12:
|
|
|
|
teleportRepledgeScreen(msg, origin, player, true, npc);
|
|
|
|
break;
|
|
|
|
case 13:
|
|
|
|
teleportRepledge(msg, origin, player, true, npc);
|
|
|
|
break;
|
|
|
|
case 14:
|
|
|
|
if (isHermit(npc))
|
|
|
|
requestHermitBlessing(msg, origin, player, npc);
|
|
|
|
else
|
|
|
|
requestBoon(msg, origin, player, npc);
|
|
|
|
break;
|
|
|
|
case 15:
|
|
|
|
LeaderboardMessage lbm = new LeaderboardMessage();
|
|
|
|
dispatch = Dispatch.borrow(player, lbm);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
|
|
|
break;
|
|
|
|
case 16:
|
|
|
|
ViewResourcesMsg vrm = new ViewResourcesMsg(player);
|
|
|
|
warehouse = npc.getBuilding();
|
|
|
|
vrm.setGuild(player.getGuild());
|
|
|
|
vrm.setWarehouseBuilding(warehouse);
|
|
|
|
vrm.configure();
|
|
|
|
dispatch = Dispatch.borrow(player, vrm);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
|
|
|
break;
|
|
|
|
case 17:
|
|
|
|
Warehouse.warehouseWithdraw(msg, player, npc);
|
|
|
|
break;
|
|
|
|
case 18:
|
|
|
|
Warehouse.warehouseDeposit(msg, player, npc);
|
|
|
|
break;
|
|
|
|
case 19:
|
|
|
|
Warehouse.warehouseLock(msg, player, npc);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|