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.
546 lines
23 KiB
546 lines
23 KiB
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . |
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· |
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ |
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ |
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ |
|
// Magicbane Emulator Project © 2013 - 2022 |
|
// www.magicbane.com |
|
|
|
|
|
package engine.devcmd.cmds; |
|
|
|
import engine.Enum.BuildingGroup; |
|
import engine.Enum.GameObjectType; |
|
import engine.Enum.TargetColor; |
|
import engine.devcmd.AbstractDevCmd; |
|
import engine.gameManager.BuildingManager; |
|
import engine.gameManager.SessionManager; |
|
import engine.math.Vector3fImmutable; |
|
import engine.objects.*; |
|
import engine.util.StringUtils; |
|
|
|
import java.text.DecimalFormat; |
|
import java.util.ArrayList; |
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
|
|
/** |
|
* @author |
|
*/ |
|
public class InfoCmd extends AbstractDevCmd { |
|
|
|
public InfoCmd() { |
|
super("info"); |
|
} |
|
|
|
@Override |
|
protected void _doCmd(PlayerCharacter pc, String[] words, |
|
AbstractGameObject target) { |
|
// Arg Count Check |
|
if (words.length != 1) { |
|
this.sendUsage(pc); |
|
return; |
|
} |
|
if (pc == null) { |
|
return; |
|
} |
|
|
|
String newline = "\r\n "; |
|
|
|
try { |
|
int targetID = Integer.parseInt(words[0]); |
|
Building b = BuildingManager.getBuilding(targetID); |
|
if (b == null) |
|
throwbackError(pc, "Building with ID " + targetID |
|
+ " not found"); |
|
else |
|
target = b; |
|
} catch (Exception e) { |
|
} |
|
|
|
if (target == null) { |
|
throwbackError(pc, "Target is unknown or of an invalid type." |
|
+ newline + "Type ID: 0x" |
|
+ pc.getLastTargetType().toString() |
|
+ " Table ID: " + pc.getLastTargetID()); |
|
return; |
|
} |
|
|
|
|
|
GameObjectType objType = target.getObjectType(); |
|
int objectUUID = target.getObjectUUID(); |
|
String output; |
|
|
|
output = "Target Information:" + newline; |
|
output += StringUtils.addWS("UUID: " + objectUUID, 20); |
|
output += newline; |
|
output += "Type: " + target.getClass().getSimpleName(); |
|
output += " [0x" + objType.toString() + ']'; |
|
|
|
if (target instanceof AbstractWorldObject) { |
|
AbstractWorldObject targetAWO = (AbstractWorldObject) target; |
|
Vector3fImmutable targetLoc = targetAWO.getLoc(); |
|
output += newline; |
|
output += StringUtils.addWS("Lat: " + targetLoc.x, 20); |
|
output += "Lon: " + -targetLoc.z; |
|
output += newline; |
|
output += StringUtils.addWS("Alt: " + targetLoc.y, 20); |
|
output += newline; |
|
output += "Rot: " + targetAWO.getRot().y; |
|
output += newline; |
|
double radian = 0; |
|
|
|
|
|
if (targetAWO.getBounds() != null && targetAWO.getBounds().getQuaternion() != null) |
|
radian = targetAWO.getBounds().getQuaternion().angleY; |
|
int degrees = (int) Math.toDegrees(radian); |
|
|
|
|
|
output += "Degrees: " + degrees; |
|
output += newline; |
|
} |
|
|
|
switch (objType) { |
|
case Building: |
|
Building targetBuilding = (Building) target; |
|
output += StringUtils.addWS("Lac: " |
|
+ targetBuilding.getw(), 20); |
|
output += "Blueprint : "; |
|
output += targetBuilding.getBlueprintUUID(); |
|
output += newline; |
|
|
|
output += " MeshUUID : "; |
|
output += targetBuilding.getMeshUUID(); |
|
output += newline; |
|
|
|
if (targetBuilding.getBlueprintUUID() != 0) |
|
output += ' ' + targetBuilding.getBlueprint().getName(); |
|
|
|
output += newline; |
|
output += targetBuilding.getBlueprint() != null ? targetBuilding.getBlueprint().getBuildingGroup().name() : " no building group"; |
|
|
|
output += newline; |
|
output += "EffectFlags: " + targetBuilding.getEffectFlags(); |
|
output += newline; |
|
output += StringUtils.addWS("rank: " + targetBuilding.getRank(), |
|
20); |
|
output += "HP: " + targetBuilding.getHealth() + '/' |
|
+ targetBuilding.getMaxHitPoints(); |
|
output += newline; |
|
output += "Scale: (" + targetBuilding.getMeshScale().getX(); |
|
output += ", " + targetBuilding.getMeshScale().getY(); |
|
output += ", " + targetBuilding.getMeshScale().getZ() + ')'; |
|
output += newline; |
|
output += "Owner UID: " + targetBuilding.getOwnerUUID(); |
|
output += (targetBuilding.isOwnerIsNPC() ? " (NPC)" : " (PC)"); |
|
output += newline; |
|
output += "ProtectionState: " + targetBuilding.getProtectionState().name(); |
|
output += newline; |
|
|
|
if (targetBuilding.getUpgradeDateTime() != null) { |
|
output += targetBuilding.getUpgradeDateTime().toString(); |
|
output += newline; |
|
} |
|
|
|
Guild guild = targetBuilding.getGuild(); |
|
Guild nation = null; |
|
String guildId = "-1"; |
|
String nationId = "-1"; |
|
String gTag = ""; |
|
String nTag = ""; |
|
|
|
if (guild != null) { |
|
int id = guild.getObjectUUID(); |
|
|
|
if (id == 0) { |
|
guildId = id + " [" + guild.hashCode() + ']'; |
|
} else |
|
guildId = Integer.toString(id); |
|
|
|
gTag = guild.getGuildTag().summarySentence(); |
|
nation = guild.getNation(); |
|
|
|
if (nation != null) { |
|
id = nation.getObjectUUID(); |
|
if (id == 0) { |
|
nationId = id + " [" + nation.hashCode() + ']'; |
|
} else { |
|
nationId = Integer.toString(id); |
|
} |
|
nTag = nation.getGuildTag().summarySentence(); |
|
} |
|
} |
|
output += StringUtils.addWS("Guild UID: " + guildId, 20); |
|
|
|
if (gTag.length() > 0) |
|
output += "Guild crest: " + gTag; |
|
|
|
output += newline; |
|
output += StringUtils.addWS("Nation UID: " + nationId, 20); |
|
|
|
if (nTag.length() > 0) { |
|
output += "Nation crest: " + nTag; |
|
} |
|
|
|
output += newline; |
|
|
|
|
|
if (targetBuilding.getBlueprint() != null) { |
|
|
|
if (targetBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.MINE) { |
|
Mine mine = Mine.getMineFromTower(targetBuilding.getObjectUUID()); |
|
|
|
if (mine != null) { |
|
output += newline; |
|
output += "Mine active: " + mine.getIsActive(); |
|
output += newline; |
|
output += "Was claimed: " + mine.wasClaimed; |
|
output += newline; |
|
output += "Mine Type: " + mine.getMineType().name; |
|
output += newline; |
|
output += "Expansion : " + mine.isExpansion(); |
|
output += newline; |
|
output += "Production type: " + mine.getProduction().name(); |
|
|
|
} |
|
} |
|
output += newline; |
|
|
|
if (targetBuilding.maintDateTime != null) { |
|
output += targetBuilding.maintDateTime.toString(); |
|
output += newline; |
|
} |
|
} |
|
|
|
output += "Reserve : " + targetBuilding.reserve; |
|
output += newline; |
|
output += "Strongbox : " + targetBuilding.getStrongboxValue(); |
|
output += newline; |
|
|
|
// List hirelings |
|
|
|
if (targetBuilding.getHirelings().isEmpty() == false) { |
|
|
|
output += newline; |
|
output += "Hirelings List: name / slot / floor"; |
|
|
|
for (AbstractCharacter npc : targetBuilding.getHirelings().keySet()) { |
|
|
|
if (npc.getObjectType() != GameObjectType.NPC) |
|
continue; |
|
output += newline + npc.getName() + " slot " + targetBuilding.getHirelings().get(npc); |
|
output += newline + "location " + npc.getLoc(); |
|
} |
|
} |
|
|
|
ArrayList<BuildingRegions> tempList = BuildingRegions._staticRegions.get(targetBuilding.getMeshUUID()); |
|
output += newline; |
|
output += "Building Regions: Size - " + tempList.size(); |
|
output += newline; |
|
output += "Building Regions from Bounds: Size - " + targetBuilding.getBounds().getRegions().size(); |
|
output += newline; |
|
|
|
for (Regions regions : targetBuilding.getBounds().getRegions()) { |
|
//TODO ADD REGION INFO |
|
} |
|
|
|
break; |
|
case PlayerCharacter: |
|
output += newline; |
|
PlayerCharacter targetPC = (PlayerCharacter) target; |
|
output += StringUtils.addWS("Name: " + targetPC.getName(), 20); |
|
output += newline; |
|
output += "InSession : " + SessionManager.getPlayerCharacterByID(target.getObjectUUID()) != null ? " true " : " false"; |
|
output += newline; |
|
output += "RaceType: " + targetPC.getRace().getRaceType().name(); |
|
output += newline; |
|
output += "Race: " + targetPC.getRace().getName(); |
|
output += newline; |
|
output += "Safe:" + targetPC.inSafeZone(); |
|
output += newline; |
|
output += "Experience : " + targetPC.getExp(); |
|
output += newline; |
|
output += "OverFlowExperience : " + targetPC.getOverFlowEXP(); |
|
output += newline; |
|
output += StringUtils.addWS("Level: " |
|
+ targetPC.getLevel() + " (" + |
|
TargetColor.getCon(targetPC, pc).toString() + ')', 20); |
|
|
|
Account acpc = SessionManager.getAccount(pc); |
|
Account ac = SessionManager.getAccount(targetPC); |
|
|
|
if (acpc != null && ac != null) { |
|
output += "Account ID: " + ac.getObjectUUID(); |
|
output += newline; |
|
output += "Access Level: " + ac.status.name(); |
|
} else |
|
output += "Account ID: UNKNOWN"; |
|
|
|
output += newline; |
|
output += "Inventory Weight:" + (targetPC.getCharItemManager().getInventoryWeight() + targetPC.getCharItemManager().getEquipWeight()); |
|
output += newline; |
|
output += "Max Inventory Weight:" + ((int) targetPC.statStrBase * 3); |
|
output += newline; |
|
output += "ALTITUDE :" + targetPC.getAltitude(); |
|
output += newline; |
|
output += "BuildingID :" + targetPC.getInBuildingID(); |
|
output += newline; |
|
output += "inBuilding :" + targetPC.getInBuilding(); |
|
output += newline; |
|
output += "inFloor :" + targetPC.getInFloorID(); |
|
output += newline; |
|
|
|
BaseClass baseClass = targetPC.getBaseClass(); |
|
|
|
if (baseClass != null) |
|
output += StringUtils.addWS("Class: " + baseClass.getName(), 20); |
|
else |
|
output += StringUtils.addWS("", 20); |
|
|
|
PromotionClass promotionClass = targetPC.getPromotionClass(); |
|
if (promotionClass != null) { |
|
output += "Pro. Class: " + promotionClass.getName(); |
|
} else { |
|
output += "Pro. Class: "; |
|
} |
|
|
|
output += newline; |
|
output += "====Guild Info===="; |
|
output += newline; |
|
|
|
if (targetPC.getGuild() != null) { |
|
output += "Name: " + targetPC.getGuild().getName(); |
|
output += newline; |
|
output += "State: " + targetPC.getGuild().getGuildState(); |
|
output += newline; |
|
output += "Realms Owned:" + targetPC.getGuild().getRealmsOwned(); |
|
output += newline; |
|
output += "====Nation===="; |
|
output += newline; |
|
output += "Nation Name: " + targetPC.getGuild().getNation().getName(); |
|
output += newline; |
|
output += "Nation State: " + targetPC.getGuild().getNation().getGuildState(); |
|
output += newline; |
|
output += "Realms Owned:" + targetPC.getGuild().getNation().getRealmsOwned(); |
|
output += newline; |
|
output += "Guild Rank:" + (GuildStatusController.getRank(targetPC.getGuildStatus()) + targetPC.getGuild().getRealmsOwnedFlag()); |
|
} |
|
|
|
output += newline; |
|
output += "Movement State: " + targetPC.getMovementState().name(); |
|
output += newline; |
|
output += "Movement Speed: " + targetPC.getSpeed(); |
|
|
|
output += "Altitude : " + targetPC.getLoc().y; |
|
|
|
output += "Swimming : " + targetPC.isSwimming(); |
|
output += newline; |
|
output += "isMoving : " + targetPC.isMoving(); |
|
|
|
break; |
|
|
|
case NPC: |
|
NPC targetNPC = (NPC) target; |
|
output += "databaseID: " + targetNPC.getDBID() + newline; |
|
output += "Name: " + targetNPC.getName(); |
|
output += newline; |
|
output += StringUtils.addWS("Level: " + targetNPC.getLevel(), 20); |
|
|
|
MobBase mobBase; |
|
|
|
if (targetNPC.getContract() == null) |
|
mobBase = targetNPC.getMobBase(); |
|
else |
|
mobBase = MobBase.getMobBase(targetNPC.getContract().getMobbaseID()); |
|
|
|
if (mobBase != null) { |
|
output += "Mobbbase: " + mobBase.getObjectUUID(); |
|
output += newline; |
|
output += "Flags: " + mobBase.getFlags().toString(); |
|
} |
|
|
|
output += newline; |
|
output += "Spawn: (" + targetNPC.getBindLoc().getX(); |
|
output += ", " + targetNPC.getBindLoc().getY(); |
|
output += ", " + targetNPC.getBindLoc().getZ() + ')'; |
|
output += newline; |
|
output += "ContractID: " + targetNPC.getContractID(); |
|
output += newline; |
|
output += "InventorySet: " + targetNPC.getContract().inventorySet; |
|
output += newline; |
|
output += targetNPC.getContract().getAllowedBuildings().toString(); |
|
output += newline; |
|
output += "Extra Rune: " + targetNPC.getContract().getExtraRune(); |
|
|
|
output += newline; |
|
output += "isTrainer: " + targetNPC.getContract().isTrainer(); |
|
output += newline; |
|
output += "Buy Cost: " + targetNPC.getBuyPercent(); |
|
output += "\tSell Cost: " + targetNPC.getSellPercent(); |
|
output += newline; |
|
output += "fromInit: " + targetNPC.isStatic(); |
|
output += newline; |
|
if (mobBase != null) { |
|
output += newline; |
|
output += "Slottable: " + targetNPC.getContract().getAllowedBuildings().toString(); |
|
output += newline; |
|
output += "EquipSet: " + targetNPC.getEquipmentSetID(); |
|
output += newline; |
|
output += "Parent Zone LoadNum : " + targetNPC.getParentZone().getLoadNum(); |
|
|
|
} |
|
|
|
if (targetNPC.region != null) { |
|
output += newline; |
|
output += "Region found: " + "Building : " + targetNPC.region.parentBuildingID + newline; |
|
output += "building level : " + targetNPC.region.level + newline; |
|
output += "building room : " + targetNPC.region.room + newline; |
|
} else { |
|
output += newline; |
|
output += "No region was found."; |
|
} |
|
|
|
if (targetNPC.getBuilding() != null) { |
|
output += newline; |
|
output += "Building : " + targetNPC.getBuilding(); |
|
} else { |
|
output += newline; |
|
output += "No building found."; |
|
} |
|
break; |
|
case Mob: |
|
Mob targetMob = (Mob) target; |
|
output += "databaseID: " + targetMob.getDBID() + newline; |
|
output += "Name: " + targetMob.getName(); |
|
output += newline; |
|
output += StringUtils.addWS("Level: " + targetMob.getLevel(), 20); |
|
mobBase = targetMob.getMobBase(); |
|
if (mobBase != null) |
|
output += "RaceID: " + mobBase.getObjectUUID(); |
|
else |
|
output += "RaceID: " + targetMob.getLoadID(); |
|
output += newline; |
|
try { |
|
output += "notEnemy: " + targetMob.notEnemy.toString(); |
|
output += newline; |
|
output += "enemy: " + targetMob.enemy.toString(); |
|
output += newline; |
|
} catch (Exception ex) { |
|
//who cares its info |
|
} |
|
output += "Spawn: (" + targetMob.getBindLoc().getX(); |
|
output += ", " + targetMob.getBindLoc().getY(); |
|
output += ", " + targetMob.getBindLoc().getZ() + ')'; |
|
output += newline; |
|
if (targetMob.isPet()) { |
|
output += "isPet: true"; |
|
output += newline; |
|
if (targetMob.isSummonedPet()) |
|
output += "isSummonedPet: true"; |
|
else |
|
output += "isSummonedPet: false"; |
|
PlayerCharacter owner = targetMob.getOwner(); |
|
if (owner != null) |
|
output += " owner: " + owner.getObjectUUID(); |
|
output += newline; |
|
output += "assist: " + targetMob.assist() + " resting: " + targetMob.isSit(); |
|
output += newline; |
|
} |
|
if (targetMob.getMobBase() != null) { |
|
output += "Mobbase: " + targetMob.getMobBase().getObjectUUID(); |
|
output += newline; |
|
output += "Flags: " + targetMob.getMobBase().getFlags().toString(); |
|
output += newline; |
|
|
|
} |
|
if (targetMob.isMob()) { |
|
output += "SpawnRadius: " + targetMob.getSpawnRadius(); |
|
output += newline; |
|
output += "Spawn Timer: " + targetMob.getSpawnTimeAsString(); |
|
output += newline; |
|
} |
|
output += StringUtils.addWS("isAlive: " |
|
+ targetMob.isAlive(), 20); |
|
output += newline; |
|
//output += "Mob State: " + targetMob.state.name(); |
|
|
|
output += newline; |
|
output += "Speed : " + targetMob.getSpeed(); |
|
output += newline; |
|
output += "EquipSet: " + targetMob.equipmentSetID; |
|
output += newline; |
|
try { |
|
output += "Parent Zone LoadNum : " + targetMob.getParentZone().getLoadNum(); |
|
} catch (Exception ex) { |
|
//who cares |
|
} |
|
output += newline; |
|
output += "isMoving : " + targetMob.isMoving(); |
|
if (targetMob.region != null) { |
|
output += newline; |
|
output += "BuildingID : " + targetMob.region.parentBuildingID; |
|
output += "building level : " + targetMob.region.level; |
|
output += "building room : " + targetMob.region.room; |
|
} |
|
if (targetMob.building != null) { |
|
output += "Building Name: " + targetMob.building.getName() + newline; |
|
output += "BuildingID : " + targetMob.building + newline; |
|
output += "Bind Loc : " + targetMob.getBindLoc() + newline; |
|
output += "Curr Loc : " + targetMob.getLoc() + newline; |
|
} else { |
|
output += newline; |
|
output += "No building found." + newline; |
|
} |
|
int max = (int)(4.882 * targetMob.level + 121.0); |
|
if(max > 321){ |
|
max = 321; |
|
} |
|
int min = (int)(4.469 * targetMob.level - 3.469); |
|
output += "Min Loot Roll = " + min; |
|
output += "Max Loot Roll = " + max; |
|
break; |
|
case Item: //intentional passthrough |
|
case MobLoot: |
|
Item item = (Item) target; |
|
ItemBase itemBase = item.getItemBase(); |
|
output += StringUtils.addWS("ItemBase: " + itemBase.getUUID(), 20); |
|
output += "Weight: " + itemBase.getWeight(); |
|
output += newline; |
|
DecimalFormat df = new DecimalFormat("###,###,###,###,##0"); |
|
output += StringUtils.addWS("Qty: " |
|
+ df.format(item.getNumOfItems()), 20); |
|
output += "Charges: " + item.getChargesRemaining() |
|
+ '/' + item.getChargesMax(); |
|
output += newline; |
|
output += "Name: " + itemBase.getName(); |
|
output += newline; |
|
output += item.getContainerInfo(); |
|
|
|
throwbackInfo(pc, output); |
|
|
|
output = "Effects:" + newline; |
|
ConcurrentHashMap<String, Effect> effects = item.getEffects(); |
|
for (String name : effects.keySet()) { |
|
Effect eff = effects.get(name); |
|
output += eff.getEffectsBase().getIDString(); |
|
output += newline; |
|
// output += eff.getEffectToken() + (eff.bakedInStat() ? " (baked in)" : "") + newline; |
|
} |
|
|
|
break; |
|
} |
|
|
|
throwbackInfo(pc, output); |
|
} |
|
|
|
@Override |
|
protected String _getHelpString() { |
|
return "Gets information on an Object."; |
|
} |
|
|
|
@Override |
|
protected String _getUsageString() { |
|
return "' /info targetID'"; |
|
} |
|
|
|
}
|
|
|