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.
251 lines
7.0 KiB
251 lines
7.0 KiB
3 years ago
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||
|
// 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");
|
||
|
|
||
|
}
|
||
|
}
|