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.
102 lines
3.3 KiB
102 lines
3.3 KiB
package engine.devcmd.cmds; |
|
|
|
import engine.InterestManagement.WorldGrid; |
|
import engine.devcmd.AbstractDevCmd; |
|
import engine.gameManager.DbManager; |
|
import engine.gameManager.ZoneManager; |
|
import engine.math.Vector3fImmutable; |
|
import engine.objects.*; |
|
|
|
/** |
|
* @author Dev command to move mobile and it's spawn location |
|
* to the player's current location |
|
*/ |
|
public class PullCmd extends AbstractDevCmd { |
|
|
|
public PullCmd() { |
|
super("pull"); |
|
} |
|
|
|
private static void MoveMobile(Mob targetMobile, PlayerCharacter pcSender, Vector3fImmutable newLoc, Zone serverZone) { |
|
|
|
Vector3fImmutable localCoords; |
|
|
|
localCoords = ZoneManager.worldToLocal(newLoc, serverZone); |
|
|
|
DbManager.MobQueries.MOVE_MOB(targetMobile.getObjectUUID(), serverZone.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z); |
|
targetMobile.setBindLoc(newLoc); |
|
targetMobile.setLoc(newLoc); |
|
targetMobile.refresh(); |
|
} |
|
|
|
private static void MoveBuilding(Building targetBuilding, PlayerCharacter pcSender, Vector3fImmutable newLoc, Zone serverZone) { |
|
|
|
Vector3fImmutable localCoords; |
|
|
|
localCoords = ZoneManager.worldToLocal(newLoc, serverZone); |
|
|
|
DbManager.BuildingQueries.MOVE_BUILDING(targetBuilding.getObjectUUID(), serverZone.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z); |
|
targetBuilding.setLoc(newLoc); |
|
targetBuilding.getBounds().setBounds(targetBuilding); |
|
targetBuilding.refresh(true); |
|
} |
|
|
|
private static void MoveNPC(NPC targetNPC, PlayerCharacter pcSender, Vector3fImmutable newLoc, Zone serverZone) { |
|
|
|
Vector3fImmutable localCoords; |
|
|
|
localCoords = ZoneManager.worldToLocal(newLoc, serverZone); |
|
|
|
DbManager.NPCQueries.MOVE_NPC(targetNPC.getObjectUUID(), serverZone.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z); |
|
targetNPC.setBindLoc(newLoc); |
|
targetNPC.setLoc(newLoc); |
|
WorldGrid.updateObject(targetNPC, pcSender); |
|
} |
|
|
|
@Override |
|
protected void _doCmd(PlayerCharacter pcSender, String[] args, |
|
AbstractGameObject target) { |
|
|
|
Mob targetMobile; |
|
Vector3fImmutable targetLoc; |
|
Zone serverZone; |
|
|
|
if (validateUserInput(pcSender, target, args) == false) { |
|
this.sendUsage(pcSender); |
|
return; |
|
} |
|
|
|
targetLoc = pcSender.getLoc(); |
|
serverZone = ZoneManager.findSmallestZone(targetLoc); |
|
switch (target.getObjectType()) { |
|
case Mob: |
|
MoveMobile((Mob) target, pcSender, targetLoc, serverZone); |
|
break; |
|
case Building: |
|
MoveBuilding((Building) target, pcSender, targetLoc, serverZone); |
|
break; |
|
case NPC: |
|
MoveNPC((NPC) target, pcSender, targetLoc, serverZone); |
|
} |
|
} |
|
|
|
@Override |
|
protected String _getUsageString() { |
|
return "/pull"; |
|
} |
|
|
|
@Override |
|
protected String _getHelpString() { |
|
return "Moves mobile (and spawn) to player's location"; |
|
} |
|
|
|
private boolean validateUserInput(PlayerCharacter pcSender, AbstractGameObject currTarget, String[] userInput) { |
|
|
|
// No target |
|
if (currTarget == null) { |
|
throwbackError(pcSender, "Requires a Mobile be targeted"); |
|
return false; |
|
} |
|
return true; |
|
} |
|
}
|
|
|