Files
prestonbane/src/engine/gameManager/NPCManager.java
T

531 lines
21 KiB
Java
Raw Normal View History

2024-04-01 17:26:38 -04:00
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
2023-03-28 17:22:57 -04:00
package engine.gameManager;
import engine.InterestManagement.WorldGrid;
2024-04-19 08:59:10 -04:00
import engine.loot.WorkOrder;
2023-08-19 15:22:43 -04:00
import engine.math.Quaternion;
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
import engine.mbEnums;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
2024-03-24 09:56:41 -04:00
import engine.net.client.ClientConnection;
import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.PetMsg;
import engine.objects.*;
import engine.powers.EffectsBase;
import engine.powers.RuneSkillAdjustEntry;
2024-03-24 09:56:41 -04:00
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
2023-03-28 17:22:57 -04:00
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ThreadLocalRandom;
2023-03-28 17:22:57 -04:00
2023-08-19 15:22:43 -04:00
import static engine.math.FastMath.acos;
2023-03-28 17:22:57 -04:00
public enum NPCManager {
2023-03-28 17:22:57 -04:00
NPC_MANAGER;
2023-03-28 17:45:58 -04:00
public static HashMap<Integer, ArrayList<Integer>> _runeSetMap = new HashMap<>();
public static void dismissNecroPet(Mob necroPet, boolean updateOwner) {
2023-08-08 13:36:46 -05:00
necroPet.setCombatTarget(null);
necroPet.hasLoot = false;
if (necroPet.parentZone != null)
necroPet.parentZone.zoneMobSet.remove(necroPet);
try {
necroPet.clearEffects();
} catch (Exception e) {
Logger.error(e.getMessage());
}
necroPet.playerAgroMap.clear();
WorldGrid.RemoveWorldObject(necroPet);
DbManager.removeFromCache(necroPet);
2023-08-27 21:04:34 -05:00
PlayerCharacter petOwner = (PlayerCharacter) necroPet.guardCaptain;
if (petOwner != null) {
2023-08-27 21:04:34 -05:00
necroPet.guardCaptain = null;
petOwner.setPet(null);
if (updateOwner == false)
return;
PetMsg petMsg = new PetMsg(5, null);
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
}
}
public static void auditNecroPets(PlayerCharacter player) {
int removeIndex = 0;
while (player.necroPets.size() >= 10) {
if (removeIndex == player.necroPets.size())
break;
Mob necroPet = player.necroPets.get(removeIndex);
if (necroPet == null) {
removeIndex++;
continue;
}
dismissNecroPet(necroPet, true);
player.necroPets.remove(necroPet);
removeIndex++;
}
}
public static void resetNecroPets(PlayerCharacter player) {
for (Mob necroPet : player.necroPets)
if (necroPet.isPet())
necroPet.agentType = mbEnums.AIAgentType.MOBILE;
}
public static void spawnNecroPet(PlayerCharacter playerCharacter, Mob mob) {
if (mob == null)
return;
if (mob.getMobBaseID() != 12021 && mob.getMobBaseID() != 12022)
return;
auditNecroPets(playerCharacter);
resetNecroPets(playerCharacter);
playerCharacter.necroPets.add(mob);
}
public static void dismissNecroPets(PlayerCharacter playerCharacter) {
if (playerCharacter.necroPets.isEmpty())
return;
for (Mob necroPet : playerCharacter.necroPets) {
try {
dismissNecroPet(necroPet, true);
} catch (Exception e) {
Logger.error(e);
}
}
playerCharacter.necroPets.clear();
}
public static void loadAllPirateNames() {
DbManager.NPCQueries.LOAD_PIRATE_NAMES();
}
public static String getPirateName(int mobBaseID) {
ArrayList<String> nameList = null;
// If we cannot find name for this mobbase then
// fallback to human male
if (NPC._pirateNames.containsKey(mobBaseID))
nameList = NPC._pirateNames.get(mobBaseID);
else
nameList = NPC._pirateNames.get(2111);
if (nameList == null) {
Logger.error("Null name list for 2111!");
}
return nameList.get(ThreadLocalRandom.current().nextInt(nameList.size()));
}
2023-08-15 08:50:02 -04:00
public static ArrayList<Building> getProtectedBuildings(NPC npc) {
ArrayList<Building> protectedBuildings = new ArrayList<>();
if (npc.building == null)
return protectedBuildings;
if (npc.building.getCity() == null)
return protectedBuildings;
for (Building b : npc.building.getCity().getParent().zoneBuildingSet) {
if (b.getBlueprint() == null)
continue;
if (b.getProtectionState().equals(mbEnums.ProtectionState.CONTRACT))
2023-08-15 08:50:02 -04:00
protectedBuildings.add(b);
if (b.getProtectionState().equals(mbEnums.ProtectionState.PENDING))
2023-08-15 08:50:02 -04:00
protectedBuildings.add(b);
}
return protectedBuildings;
}
2023-08-19 15:22:43 -04:00
public static int slotCharacterInBuilding(AbstractCharacter abstractCharacter) {
int buildingSlot;
if (abstractCharacter.building == null)
return -1;
// Get next available slot for this NPC and use it
// to add the NPC to the building's hireling list
// Account for R8's having slots reversed.
if (abstractCharacter.building.getBlueprint() != null && abstractCharacter.building.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.TOL) && abstractCharacter.building.getRank() == 8)
2023-08-19 15:22:43 -04:00
buildingSlot = BuildingManager.getLastAvailableSlot(abstractCharacter.building);
2023-08-27 22:57:11 -04:00
else
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
// Override slot for siege engines
if (abstractCharacter.getObjectType().equals(mbEnums.GameObjectType.Mob) && ((Mob) abstractCharacter).behaviourType.equals(mbEnums.MobBehaviourType.SiegeEngine)) {
2023-08-27 22:57:11 -04:00
Mob siegeMobile = (Mob) abstractCharacter;
buildingSlot = siegeMobile.guardCaptain.minions.size() + 2;
2023-08-27 21:26:00 -05:00
}
2023-08-27 22:57:11 -04:00
2023-08-19 15:22:43 -04:00
if (buildingSlot == -1)
Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
2023-08-27 21:25:43 -04:00
// Pets are regular mobiles not hirelings (Siege engines)
2023-08-27 22:57:11 -04:00
if (abstractCharacter.contract != null)
2023-08-27 21:38:31 -05:00
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
2023-08-19 15:22:43 -04:00
// Override bind and location for this npc derived
// from BuildingManager slot location data.
Vector3fImmutable slotLocation = BuildingManager.getSlotLocation(abstractCharacter.building, buildingSlot).getLocation();
abstractCharacter.bindLoc = abstractCharacter.building.getLoc().add(slotLocation);
// Rotate slot position by the building rotation
abstractCharacter.bindLoc = Vector3fImmutable.rotateAroundPoint(abstractCharacter.building.getLoc(), abstractCharacter.bindLoc, abstractCharacter.building.getBounds().getQuaternion().angleY);
abstractCharacter.loc = new Vector3fImmutable(abstractCharacter.bindLoc);
// Rotate NPC rotation by the building's rotation
Quaternion slotRotation = new Quaternion().fromAngles(0, acos(abstractCharacter.getRot().y) * 2, 0);
slotRotation = slotRotation.mult(abstractCharacter.building.getBounds().getQuaternion());
abstractCharacter.setRot(new Vector3f(0, slotRotation.y, 0));
// Configure region and floor/level for this NPC
abstractCharacter.region = BuildingManager.GetRegion(abstractCharacter.building, abstractCharacter.bindLoc.x, abstractCharacter.bindLoc.y, abstractCharacter.bindLoc.z);
return buildingSlot;
}
2023-08-25 14:33:43 -04:00
public static void AssignPatrolPoints(Mob mob) {
mob.patrolPoints = new ArrayList<>();
for (int i = 0; i < 5; ++i) {
float patrolRadius = mob.getSpawnRadius();
if (patrolRadius > 256)
patrolRadius = 256;
if (patrolRadius < 60)
patrolRadius = 60;
Vector3fImmutable newPatrolPoint = Vector3fImmutable.getRandomPointInCircle(mob.getBindLoc(), patrolRadius);
mob.patrolPoints.add(newPatrolPoint);
if (i == 1) {
mob.setLoc(newPatrolPoint);
mob.endLoc = newPatrolPoint;
}
}
}
2023-09-09 20:06:33 -05:00
2024-03-24 09:42:27 -04:00
public static void applyGuardStanceModifiers(Mob guard) {
2023-09-09 19:41:32 -05:00
float damageModifier = 1;
float attackRatingModifier = 1;
float defenseModifier = 1;
float attackSpeedModifier = 1;
float powerDamageModifier = 1;
//handle stance modifiers for guard mob
if (guard.agentType.equals(mbEnums.AIAgentType.GUARDWALLARCHER)) {
2023-09-09 19:41:32 -05:00
//apply rogue bonuses
attackRatingModifier += 0.5f;
defenseModifier += 0.5f;
2023-09-09 20:37:47 -05:00
damageModifier += 0.5f;
attackSpeedModifier -= 0.36f;
2024-03-24 09:42:27 -04:00
} else {
2023-09-09 19:23:46 -05:00
Integer contractID;
if (guard.agentType.equals(mbEnums.AIAgentType.GUARDMINION)) {
2023-09-09 19:23:46 -05:00
contractID = guard.guardCaptain.contract.getContractID();
2024-03-24 09:42:27 -04:00
} else {
2023-09-09 19:23:46 -05:00
contractID = guard.contract.getContractID();
}
if (mbEnums.MinionType.ContractToMinionMap.get(contractID) != null && mbEnums.MinionType.ContractToMinionMap.get(contractID).isMage()) {
2023-09-09 19:23:46 -05:00
//apply mage offensive Stance
2023-09-09 19:41:32 -05:00
powerDamageModifier += 0.5f;
2024-03-24 09:42:27 -04:00
} else {
2023-09-09 19:23:46 -05:00
//apply fighter offensive stance
2023-09-09 19:41:32 -05:00
damageModifier += 0.5f;
attackSpeedModifier -= 0.36f;
2023-09-09 19:23:46 -05:00
}
}
2023-09-09 19:41:32 -05:00
guard.minDamageHandOne *= damageModifier;
guard.minDamageHandTwo *= damageModifier;
guard.maxDamageHandOne *= damageModifier;
guard.maxDamageHandTwo *= damageModifier;
guard.atrHandOne *= attackRatingModifier;
guard.atrHandTwo *= attackRatingModifier;
guard.defenseRating *= defenseModifier;
guard.speedHandOne *= attackSpeedModifier;
guard.speedHandTwo *= attackSpeedModifier;
//TODO figure out how to apply +50% powerdamage to mage guards
}
2023-09-09 20:06:33 -05:00
2024-03-24 09:42:27 -04:00
public static void setDamageAndSpeedForGuard(Mob guard) {
2023-09-09 19:23:46 -05:00
2023-09-09 20:37:47 -05:00
float rankModifier = 1 + (guard.getRank() * 0.1f);
int primaryStat = 0;
2024-03-18 10:12:13 -04:00
if (guard.charItemManager.equipped.isEmpty()) {
guard.minDamageHandOne = (int) ((guard.mobBase.getDamageMin()) * rankModifier);
guard.maxDamageHandOne = (int) ((guard.mobBase.getDamageMax()) * rankModifier);
2023-09-09 19:23:46 -05:00
guard.speedHandOne = 30.0f;
2024-03-18 10:12:13 -04:00
} else {
if (guard.charItemManager.equipped.containsKey(mbEnums.EquipSlotType.RHELD)) {
2023-09-09 19:23:46 -05:00
//has main hand weapon
Item weapon = guard.charItemManager.equipped.get(mbEnums.EquipSlotType.RHELD);
2024-03-16 18:31:21 -04:00
if (weapon.template.item_primary_attr.equals(mbEnums.AttributeType.Strength))
2023-09-09 20:37:47 -05:00
primaryStat = guard.getStatStrCurrent();
else
primaryStat = guard.getStatDexCurrent();
2024-03-16 18:31:21 -04:00
guard.minDamageHandOne = (int) ((guard.mobBase.getDamageMin() + weapon.template.item_weapon_damage.values().iterator().next()[0]) * rankModifier) + primaryStat;
guard.maxDamageHandOne = (int) ((guard.mobBase.getDamageMax() + weapon.template.item_weapon_damage.values().iterator().next()[1]) * rankModifier) + primaryStat;
guard.speedHandOne = weapon.template.item_weapon_wepspeed;
guard.rangeHandOne = weapon.template.item_weapon_max_range;
} else if (guard.charItemManager.equipped.containsKey(mbEnums.EquipSlotType.LHELD) && !ItemManager.isShield(guard.charItemManager.equipped.get(mbEnums.EquipSlotType.LHELD).template)) {
2023-09-09 19:23:46 -05:00
//has off hand weapon
Item weapon = guard.charItemManager.equipped.get(mbEnums.EquipSlotType.LHELD);
if (weapon.template.item_primary_attr.equals(mbEnums.AttributeType.Strength))
2023-09-09 20:37:47 -05:00
primaryStat = guard.getStatStrCurrent();
else
primaryStat = guard.getStatDexCurrent();
2024-03-16 18:31:21 -04:00
guard.minDamageHandOne = (int) ((guard.mobBase.getDamageMin() + weapon.template.item_weapon_damage.values().iterator().next()[0]) * rankModifier) + primaryStat;
guard.maxDamageHandOne = (int) ((guard.mobBase.getDamageMax() + weapon.template.item_weapon_damage.values().iterator().next()[1]) * rankModifier) + primaryStat;
guard.speedHandOne = weapon.template.item_weapon_wepspeed;
guard.rangeHandOne = weapon.template.item_weapon_max_range;
2023-09-09 19:23:46 -05:00
} else {
2023-09-09 20:37:47 -05:00
primaryStat = guard.getStatStrCurrent();
2024-03-24 09:42:27 -04:00
guard.minDamageHandOne = (int) ((guard.mobBase.getDamageMin()) * rankModifier) + primaryStat;
guard.maxDamageHandOne = (int) ((guard.mobBase.getDamageMax()) * rankModifier) + primaryStat;
2023-09-09 19:23:46 -05:00
guard.speedHandOne = 30.0f;
2023-09-09 20:11:00 -05:00
guard.rangeHandOne = 3;
2023-09-09 19:23:46 -05:00
}
}
}
2024-03-24 09:42:27 -04:00
public static void setDefenseForGuard(Mob guard) {
2023-09-09 19:57:17 -05:00
int dexterity = guard.getStatDexCurrent();
2024-03-24 09:42:27 -04:00
if (dexterity < 1)
2023-09-09 19:57:17 -05:00
dexterity = 1;
int baseDef = guard.mobBase.getDefenseRating();
int armorDefense = 0;
2024-03-18 10:12:13 -04:00
for (Item equipped : guard.charItemManager.equipped.values())
if (equipped.template.item_type.equals(mbEnums.ItemType.ARMOR) || ItemManager.isShield(equipped.template))
2024-03-16 18:31:21 -04:00
armorDefense += equipped.template.item_defense_rating;
2023-09-09 19:57:17 -05:00
guard.defenseRating = dexterity + baseDef + armorDefense;
2023-09-09 19:23:46 -05:00
}
2023-09-09 19:57:17 -05:00
public static void setAttackRatingForGuard(Mob guard) {
int strength = guard.getStatStrCurrent();
int baseAtr = guard.mobBase.getAttackRating();
if (guard.charItemManager.equipped.get(mbEnums.EquipSlotType.RHELD) != null)
guard.atrHandOne = baseAtr + (int) ((strength * 0.5f) + ((int) guard.charItemManager.equipped.get(mbEnums.EquipSlotType.RHELD).template.item_skill_required.values().toArray()[0] * 4) + ((int) guard.charItemManager.equipped.get(mbEnums.EquipSlotType.RHELD).template.item_skill_required.values().toArray()[0] * 3));
else if (guard.charItemManager.equipped.get(mbEnums.EquipSlotType.LHELD) != null && !ItemManager.isShield(guard.charItemManager.equipped.get(mbEnums.EquipSlotType.LHELD).template))
guard.atrHandTwo = baseAtr + (int) ((strength * 0.5f) + ((int) guard.charItemManager.equipped.get(mbEnums.EquipSlotType.LHELD).template.item_skill_required.values().toArray()[0] * 4) + ((int) guard.charItemManager.equipped.get(mbEnums.EquipSlotType.LHELD).template.item_skill_required.values().toArray()[0] * 3));
2023-09-09 19:57:17 -05:00
else
guard.atrHandOne = baseAtr;
2023-09-09 19:23:46 -05:00
}
2024-03-24 09:42:27 -04:00
public static void setMaxHealthForGuard(Mob guard) {
2023-09-09 19:23:46 -05:00
//values derived fom reading memory address for health on client when selecting player guards
2024-03-24 09:42:27 -04:00
switch (guard.getRank()) {
2023-09-09 19:23:46 -05:00
default:
guard.healthMax = 750; //rank 1
break;
case 2:
2024-03-24 09:42:27 -04:00
guard.healthMax = 2082;
2023-09-09 19:23:46 -05:00
break;
case 3:
2024-03-24 09:42:27 -04:00
guard.healthMax = 2740;
2023-09-09 19:23:46 -05:00
break;
case 4:
2024-03-24 09:42:27 -04:00
guard.healthMax = 3414;
2023-09-09 19:23:46 -05:00
break;
case 5:
2024-03-24 09:42:27 -04:00
guard.healthMax = 4080;
2023-09-09 19:23:46 -05:00
break;
case 6:
2024-03-24 09:42:27 -04:00
guard.healthMax = 4746;
2023-09-09 19:23:46 -05:00
break;
case 7:
2024-03-24 09:42:27 -04:00
guard.healthMax = 5412;
2023-09-09 19:23:46 -05:00
break;
}
2024-03-27 17:54:28 -05:00
guard.setHealth(guard.healthMax);
2023-09-09 19:23:46 -05:00
}
2023-09-09 19:57:17 -05:00
public static void applyMobbaseEffects(Mob mob) {
EffectsBase effectsBase;
for (MobBaseEffects mbe : mob.mobBase.effectsList) {
effectsBase = PowersManager.getEffectByToken(mbe.getToken());
if (effectsBase == null) {
Logger.info("Mob: " + mob.getObjectUUID() + " EffectsBase Null for Token " + mbe.getToken());
continue;
}
//check to upgrade effects if needed.
if (mob.effects.containsKey(Integer.toString(effectsBase.getUUID()))) {
if (mbe.getReqLvl() > (int) mob.level)
continue;
Effect eff = mob.effects.get(Integer.toString(effectsBase.getUUID()));
if (eff == null)
continue;
//Current effect is a higher rank, dont apply.
if (eff.getTrains() > mbe.getRank())
continue;
//new effect is of a higher rank. remove old effect and apply new one.
eff.cancelJob();
mob.addEffectNoTimer(Integer.toString(effectsBase.getUUID()), effectsBase, mbe.getRank(), true);
} else {
if (mbe.getReqLvl() > (int) mob.level)
continue;
mob.addEffectNoTimer(Integer.toString(effectsBase.getUUID()), effectsBase, mbe.getRank(), true);
}
}
}
2024-03-24 09:42:27 -04:00
public static void applyEquipmentResists(Mob mob) {
2024-03-06 14:53:17 -05:00
2024-03-18 10:12:13 -04:00
if (mob.charItemManager.equipped.isEmpty())
2024-03-06 14:53:17 -05:00
return;
2024-03-18 10:12:13 -04:00
for (Item equipped : mob.charItemManager.equipped.values()) {
if (equipped.template.item_type.equals(mbEnums.ItemType.ARMOR)) {
mob.resists.setResist(mbEnums.DamageType.SLASHING, mob.resists.getResist(mbEnums.DamageType.SLASHING, 0) + equipped.template.combat_attack_resist.get("SLASHING"));
mob.resists.setResist(mbEnums.DamageType.CRUSHING, mob.resists.getResist(mbEnums.DamageType.CRUSHING, 0) + equipped.template.combat_attack_resist.get("CRUSHING"));
mob.resists.setResist(mbEnums.DamageType.PIERCING, mob.resists.getResist(mbEnums.DamageType.PIERCING, 0) + equipped.template.combat_attack_resist.get("PIERCING"));
2024-03-06 14:53:17 -05:00
}
}
}
2023-09-02 20:29:03 -05:00
2023-09-02 20:39:36 -05:00
public static void applyMobbaseSkill(Mob mob) {
SkillsBase baseSkill = DbManager.SkillsBaseQueries.GET_BASE_BY_TOKEN(mob.mobBase.getMobBaseStats().getBaseSkill());
2024-03-24 09:42:27 -04:00
if (baseSkill != null)
mob.getSkills().put(baseSkill.getName(), new CharacterSkill(baseSkill, mob, mob.mobBase.getMobBaseStats().getBaseSkillAmount()));
2023-09-02 20:29:03 -05:00
}
2024-03-24 09:42:27 -04:00
public static void applyRuneSkills(Mob mob, int runeID) {
//load mob skill adjustments from mobbase rune
2024-03-24 09:42:27 -04:00
if (PowersManager._allRuneSkillAdjusts.containsKey(runeID))
for (RuneSkillAdjustEntry entry : PowersManager._allRuneSkillAdjusts.get(runeID)) {
if (SkillsBase.getFromCache(entry.skill_type) == null)
SkillsBase.putInCache(DbManager.SkillsBaseQueries.GET_BASE_BY_NAME(entry.skill_type));
SkillsBase skillBase = SkillsBase.getFromCache(entry.skill_type);
2024-03-24 09:42:27 -04:00
if (skillBase == null)
continue;
2023-09-03 20:10:57 -05:00
if (entry.level <= mob.level)
if (mob.skills.containsKey(entry.name) == false)
mob.skills.put(entry.skill_type, new CharacterSkill(skillBase, mob, entry.rank));
else
2023-09-03 20:10:57 -05:00
mob.skills.put(entry.skill_type, new CharacterSkill(skillBase, mob, entry.rank + mob.skills.get(entry.skill_type).getNumTrains()));
}
}
2023-09-13 20:12:07 -05:00
2024-03-24 09:42:27 -04:00
public static void applyRunesForNPC(NPC npc) {
2023-09-13 20:45:21 -05:00
npc.runes = new ArrayList<>();
2023-09-13 21:56:18 -05:00
RuneBase shopkeeperBase = RuneBase.getRuneBase(252620);
2024-03-24 09:42:27 -04:00
CharacterRune shopkeeper = new CharacterRune(shopkeeperBase, npc.getObjectUUID());
2023-09-13 21:56:18 -05:00
npc.runes.add(shopkeeper);
2024-03-24 09:42:27 -04:00
if (NPCManager._runeSetMap.containsKey(npc.runeSetID)) {
2023-09-13 21:56:18 -05:00
for (int runeID : _runeSetMap.get(npc.runeSetID)) {
RuneBase rb = RuneBase.getRuneBase(runeID);
2024-03-24 09:42:27 -04:00
if (rb != null) {
2023-09-13 22:04:23 -05:00
CharacterRune toApply = new CharacterRune(rb, npc.getObjectUUID());
npc.runes.add(toApply);
}
2023-09-13 21:56:18 -05:00
}
2023-09-13 20:12:07 -05:00
}
}
2024-03-24 09:56:41 -04:00
public static Boolean NPCVaultBankRangeCheck(PlayerCharacter pc, ClientConnection origin, String bankorvault) {
if (pc == null)
return false;
NPC npc = pc.getLastNPCDialog();
if (npc == null)
return false;
// System.out.println(npc.getContract().getName());
// last npc must be either a banker or vault keeper
if (bankorvault.equals("vault")) {
if (npc.getContract().getContractID() != 861)
return false;
} else
// assuming banker
if (!npc.getContract().getName().equals("Bursar"))
return false;
if (pc.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
ErrorPopupMsg.sendErrorPopup(pc, 14);
return false;
} else
return true;
}
2024-04-19 08:59:10 -04:00
public static ArrayList<Item> getAllCookingForVendor(NPC npc) {
ArrayList<Item> itemList = new ArrayList<>();
for (WorkOrder workOrder : ForgeManager.vendorWorkOrderLookup.get(npc))
itemList.addAll(workOrder.cooking);
return itemList;
}
2023-03-28 17:22:57 -04:00
}