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
			| 
											4 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");
 | ||
|  | 
 | ||
|  | 	}
 | ||
|  | }
 |