Public Repository for the Magicbane Shadowbane Emulator
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.

251 lines
7.0 KiB

// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
import engine.objects.*;
public class RotateCmd extends AbstractDevCmd {
public RotateCmd() {
super("rotate");
this.addCmdString("rot");
}
@Override
protected void _doCmd(PlayerCharacter pc, String[] words,
AbstractGameObject target) {
if (target == null && (words.length != 2) ) {
this.sendUsage(pc);
return;
}
if (words.length == 3){
try{
}catch(Exception e){
}
}
float rot;
if (target != null && words.length == 1) {
try {
if (words[0].equalsIgnoreCase("face")){
this.rotateFace(pc, target);
return;
}
rot = Float.parseFloat(words[0]);
} catch (NumberFormatException e) {
throwbackError(pc, "Supplied rotation " + words[0]
+ " failed to parse to a Float");
return;
} catch (Exception e) {
throwbackError(pc,
"Invalid Rotate Command. Need Rotation specified.");
return;
}
Vector3f rotation = new Vector3f(0f, rot, 0f);
if (target instanceof Building)
rotateBuilding(pc, (Building) target, rotation, rot,false);
else if (target instanceof NPC)
rotateNPC(pc, (NPC) target, rotation,false);
else if (target instanceof Mob)
rotateMob(pc, (Mob) target, rotation,false);
else
throwbackError(pc, "Target " + target.getObjectType()
+ " is not a valid object type");
} else {
int id = 0;
if (words.length == 2) {
try {
id = Integer.parseInt(words[0]);
if (words[1].equalsIgnoreCase("face")){
Building b;
if (id != 0)
b = BuildingManager.getBuilding(id);
else
b = getTargetAsBuilding(pc);
if (b != null) {
rotateFace(pc, b);
return;
}
// building failed, try npc
NPC npc;
if (id != 0)
npc = NPC.getNPC(id);
else
npc = getTargetAsNPC(pc);
if (npc != null) {
rotateFace(pc, npc);
return;
}
// NPC failed, try mob
Mob mob;
if (id != 0)
mob = Mob.getMob(id);
else
mob = getTargetAsMob(pc);
if (mob != null) {
rotateFace(pc, mob);
return;
}
throwbackError(pc, "Nothing found to rotate.");
return;
}
rot = Float.parseFloat(words[1]);
} catch (NumberFormatException e) {
throwbackError(pc, "Supplied arguments " + words[0] + ' '
+ words[1] + " failed to parse");
return;
} catch (Exception e) {
throwbackError(pc,
"Invalid Rotate Command. Need Rotation specified.");
return; // NaN
}
} else {
try {
rot = Float.parseFloat(words[0]);
} catch (NumberFormatException e) {
throwbackError(pc, "Supplied rotation " + words[0]
+ " failed to parse to a Float");
return;
} catch (Exception e) {
throwbackError(pc,
"Invalid Rotate Command. Need Rotation specified.");
return; // NaN
}
}
Vector3f rotation = new Vector3f(0f, rot, 0f);
Building b;
if (id != 0)
b = BuildingManager.getBuilding(id);
else
b = getTargetAsBuilding(pc);
if (b != null) {
rotateBuilding(pc, b, rotation, rot,false);
return;
}
// building failed, try npc
NPC npc;
if (id != 0)
npc = NPC.getNPC(id);
else
npc = getTargetAsNPC(pc);
if (npc != null) {
rotateNPC(pc, npc, rotation,false);
return;
}
// NPC failed, try mob
Mob mob;
if (id != 0)
mob = Mob.getMob(id);
else
mob = getTargetAsMob(pc);
if (mob != null) {
rotateMob(pc, mob, rotation,false);
return;
}
throwbackError(pc, "Nothing found to rotate.");
}
}
@Override
protected String _getHelpString() {
return "Rotates targeted or specified object";
}
@Override
protected String _getUsageString() {
return "' /rotate [objectID] rotation' || ' /rot [objectID] rotation'";
}
private void rotateBuilding(PlayerCharacter pc, Building building, Vector3f rot, float orig, boolean faceDirection) {
if (!faceDirection)
rot.set(0.0f, (float)Math.sin(Math.toRadians(orig)/2), 0.0f);
building.setRot(rot);
building.setw( (float) Math.abs(Math.cos(Math.toRadians(orig)/2)) );
building.getBounds().setBounds(building);
WorldGrid.updateObject(building, pc);
DbManager.BuildingQueries.SET_PROPERTY(building, "rotY", building.getRot().getY());
DbManager.BuildingQueries.SET_PROPERTY(building, "w", building.getw());
ChatManager.chatSayInfo(pc,
"Building with ID " + building.getObjectUUID() + " rotated");
}
private void rotateNPC(PlayerCharacter pc, NPC npc, Vector3f rot,boolean faceDirection) {
npc.setRot(rot);
DbManager.NPCQueries.SET_PROPERTY(npc, "npc_rotation", rot.y);
WorldGrid.updateObject(npc, pc);
//no rotation for npc's in db currently
ChatManager.chatSayInfo(pc,
"NPC with ID " + npc.getObjectUUID() + " rotated");
}
private void rotateMob(PlayerCharacter pc, Mob mob, Vector3f rot,boolean faceDirection) {
mob.setRot(rot);
DbManager.MobQueries.SET_PROPERTY(mob, "mob_rotation", rot.y);
WorldGrid.updateObject(mob, pc);
//no rotation for mobs's in db currently
ChatManager.chatSayInfo(pc,
"Mob with ID " + mob.getObjectUUID() + " rotated");
}
private void rotateFace(PlayerCharacter pc, AbstractGameObject target){
AbstractWorldObject awo = (AbstractWorldObject)target;
if (awo == null)
return;
Vector3fImmutable buildingLoc = awo.getLoc();
Vector3fImmutable playerLoc = pc.getLoc();
Vector3fImmutable faceDirection = playerLoc.subtract2D(buildingLoc);
float rotangle = faceDirection.getRotation();
float rot = (float) Math.toDegrees(rotangle);
if (rot > 180)
rot*=-1;
Vector3f buildingrotation = new Vector3f(0f, rot, 0f);
Vector3f rotation = new Vector3f(0f, rotangle, 0f);
if (target instanceof Building)
rotateBuilding(pc, (Building) target, buildingrotation, rot,false);
else if (target instanceof NPC)
rotateNPC(pc, (NPC) target, rotation,true);
else if (target instanceof Mob)
rotateMob(pc, (Mob) target, rotation,true);
else
throwbackError(pc, "Target " + target.getObjectType()
+ " is not a valid object type");
}
}