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
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . |
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· |
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ |
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ |
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ |
|
// 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"); |
|
|
|
} |
|
} |