HelmedRaven

SWGEmu - /tool command

Aug 6th, 2020 (edited)
1,303
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifndef TOOLCOMMAND_H_
  2. #define TOOLCOMMAND_H_
  3.  
  4. #include "server/zone/objects/scene/SceneObject.h"
  5. #include "server/zone/objects/creature/ai/AiAgent.h"
  6. #include "server/zone/packets/player/PlayMusicMessage.h"
  7. #include "server/zone/packets/chat/ChatSystemMessage.h"
  8.  
  9. class ToolCommand : public QueueCommand {
  10. public:
  11.  
  12.     ToolCommand(const String& name, ZoneProcessServer* server)
  13.         : QueueCommand(name, server) {
  14.  
  15.     }
  16.  
  17.     int doQueueCommand(CreatureObject* creature, const uint64& target, const UnicodeString& arguments) const {
  18.  
  19.         if (!checkStateMask(creature))
  20.             return INVALIDSTATE;
  21.  
  22.         if (!checkInvalidLocomotions(creature))
  23.             return INVALIDLOCOMOTION;
  24.  
  25.         if (!creature->isPlayerCreature())
  26.             return GENERALERROR;
  27.  
  28.         ManagedReference<PlayerObject*> ghost = creature->getPlayerObject();
  29.  
  30.         if (ghost == nullptr)
  31.             return GENERALERROR;
  32.  
  33.         int adminLevelCheck = ghost->getAdminLevel();
  34.  
  35.         ResourceManager* resMan = creature->getZoneServer()->getResourceManager();
  36.  
  37.         Locker locker(resMan);
  38.  
  39.         StringTokenizer args(arguments.toString());
  40.  
  41.         try {
  42.             String command, Result, secondCommand;
  43.  
  44.             if(args.hasMoreTokens()){
  45.                 args.getStringToken(command);
  46.                
  47.                 command = command.toLowerCase();
  48.                 ManagedReference<SceneObject*> object;
  49.                 if(target != 0) {
  50.                     object = server->getZoneServer()->getObject(target, false);
  51.                 }
  52.  
  53.                 if(command == "help") {
  54.                     creature->sendSystemMessage("/tool rotate <left right yaw pitch roll reset yxx pxx rxx> <value>");
  55.                     creature->sendSystemMessage("/tool move <forward back up down> <value>");
  56.                     creature->sendSystemMessage("/tool tjt <x> <y> <z> <rW> <rX> <rY> <rZ> (To be used with The Jawa Toolset)");
  57.                     creature->sendSystemMessage("/tool face <n nw ne e s sw se w up down left right>");
  58.                     creature->sendSystemMessage("/tool tp <x y z> <coordinate>");
  59.                     creature->sendSystemMessage("/tool align");
  60.                 } else if(command == "rotate") {
  61.                     rotate(creature, target, adminLevelCheck, &args);
  62.                 } else if(command == "move") {
  63.                     move(creature, target, adminLevelCheck, &args);
  64.                 }else if(command == "tjt") {
  65.                     tjtMove(creature, target, adminLevelCheck, &args);
  66.                 }else if(command == "face") {
  67.                     faceDir(creature, target, adminLevelCheck, &args);
  68.                 }else if(command == "tp" && adminLevelCheck > 0) {
  69.                     teleportItem(creature, target, adminLevelCheck, &args);
  70.                 }else if(command == "align" && adminLevelCheck > 0) {
  71.                     alignToObject(creature, target, adminLevelCheck, &args);
  72.                 }else {
  73.                     throw Exception();
  74.                     creature->sendSystemMessage("Invalid arguments for Tool command. Help: /tool help");
  75.                 }            
  76.             } else {
  77.                 throw Exception();
  78.             }
  79.         } catch (Exception& e){
  80.             //creature->sendSystemMessage("Invalid arguments for RP command. Help: /rp help");            
  81.            
  82.         }
  83.  
  84.         return SUCCESS;
  85.     }
  86.    
  87.     void faceDir(CreatureObject* creature, const uint64& target, int adminLevelCheck, StringTokenizer* args) const {
  88.         ManagedReference<SceneObject*> object = server->getZoneServer()->getObject(target, false);
  89.         if (object == nullptr){
  90.             creature->sendSystemMessage("Target required for /tool face");
  91.             throw Exception();
  92.         }
  93.        
  94.         if (adminLevelCheck < 15){
  95.             playerMoveRotateRules(creature, object);
  96.         }
  97.        
  98.         String possibleDirections = "n nw ne e s sw se w up down left right";
  99.         String dir = "";
  100.        
  101.         if(args->hasMoreTokens()){
  102.             args->getStringToken(dir);
  103.         }
  104.        
  105.         dir = dir.toLowerCase();
  106.  
  107.         if(!possibleDirections.contains(dir))
  108.             throw Exception();
  109.  
  110.         // Setup rotation
  111.         if (dir == "n"){
  112.             object->setDirection(1.0, 0.0, 0.0, 0.0);
  113.         }
  114.         else if (dir == "s"){
  115.             object->setDirection(0.0, 0.0, 1.0, 0.0);
  116.         }
  117.         else if (dir == "w"){
  118.             object->setDirection(0.707, 0.0, -0.707, 0.0);
  119.         }
  120.         else if (dir == "e"){
  121.             object->setDirection(0.707, 0.0, 0.707, 0.0);
  122.         }
  123.         else if (dir == "nw"){
  124.             object->setDirection(0.924, 0.0, -0.383, 0.0);
  125.         }
  126.         else if (dir == "ne"){
  127.             object->setDirection(0.924, 0.0, 0.383, 0.0);
  128.         }
  129.         else if (dir == "sw"){
  130.             object->setDirection(0.383, 0.0, -0.924, 0.0);
  131.         }
  132.         else if (dir == "se"){
  133.             object->setDirection(0.383, 0.0, 0.924, 0.0);
  134.         }
  135.         else if (dir == "up"){
  136.             object->setDirection(0.707, 0.0, 0.0, 0.707);
  137.         }
  138.         else if (dir == "down"){
  139.             object->setDirection(0.707, 0.0, 0.0, -0.707);
  140.         }
  141.         else if (dir == "right"){
  142.             object->setDirection(0.707, -0.707, 0.0, 0.0);
  143.         }
  144.         else if (dir == "left"){
  145.             object->setDirection(0.707, 0.707, 0.0, 0.0);
  146.         }
  147.        
  148.         // Apply rotation
  149.         object->incrementMovementCounter();
  150.         if (object->getParent() != nullptr)
  151.             object->teleport(object->getPositionX(), object->getPositionZ(), object->getPositionY(), object->getParent().get()->getObjectID());
  152.         else
  153.             object->teleport(object->getPositionX(), object->getPositionZ(), object->getPositionY());
  154.     }
  155.    
  156.     // Rotate objects with Yaw, Pitch, Roll. Also allows admin to rotate most objects and players to rotate LoH decor outside in Mos Espa.
  157.     void rotate(CreatureObject* creature, const uint64& target, int adminLevelCheck, StringTokenizer* args) const {
  158.         ManagedReference<SceneObject*> object = server->getZoneServer()->getObject(target, false);
  159.  
  160.         if (object == nullptr){
  161.             creature->sendSystemMessage("Target required for /tool rotate");
  162.             throw Exception();
  163.         }
  164.  
  165.         if (object->isCreatureObject()){
  166.             creature->sendSystemMessage("Error: Invalid Target. Must not be a creature.");
  167.             throw Exception();
  168.         }
  169.  
  170.         if (adminLevelCheck < 15){
  171.             playerMoveRotateRules(creature, object);
  172.         }
  173.  
  174.         String possibleDirections = "left right yaw pitch roll reset yxx pxx rxx";
  175.         String dir = "";
  176.         String deg = "";
  177.         int degrees = 0;
  178.  
  179.         if(args->hasMoreTokens()){
  180.             args->getStringToken(dir);
  181.             args->getStringToken(deg);
  182.         }
  183.  
  184.         dir = dir.toLowerCase();
  185.  
  186.         if(!possibleDirections.contains(dir))
  187.             throw Exception();
  188.  
  189.         if(deg.isEmpty())
  190.             throw Exception();
  191.  
  192.         try {
  193.             degrees = Integer::valueOf(deg);
  194.         } catch (const Exception& e) {
  195.             creature->sendSystemMessage("Error: /tool rotate <direction> [number] was not provided a numerical value.");
  196.         }
  197.  
  198.         // Setup rotation
  199.         if (dir == "right"){
  200.             object->rotate(-degrees);
  201.         }
  202.         else if (dir == "left"){
  203.             object->rotate(degrees);
  204.         }
  205.         else if (dir == "yaw" || dir == "yxx"){
  206.             object->rotate(degrees);
  207.         }
  208.         else if (dir == "pitch" || dir == "pxx"){
  209.             object->rotateYaxis(degrees);
  210.         }
  211.         else if (dir == "roll" || dir == "rxx"){
  212.             object->rotateXaxis(degrees);
  213.         }
  214.         else if (dir == "reset" || dir == "xresetx"){
  215.             object->setDirection(1, 0, 0, 0);
  216.         } else {
  217.             creature->sendSystemMessage("Error: /tool rotate command requires using the whole direction word.");
  218.             throw Exception();
  219.         }
  220.  
  221.         // Apply rotation
  222.         object->incrementMovementCounter();
  223.         if (object->getParent() != nullptr)
  224.             object->teleport(object->getPositionX(), object->getPositionZ(), object->getPositionY(), object->getParent().get()->getObjectID());
  225.         else
  226.             object->teleport(object->getPositionX(), object->getPositionZ(), object->getPositionY());
  227.     }
  228.  
  229.     // Allows admin to move most objects and players to move LoH decor outside in Mos Espa.
  230.     void move(CreatureObject* creature, const uint64& target, int adminLevelCheck, StringTokenizer* args) const {
  231.         ManagedReference<SceneObject*> object = server->getZoneServer()->getObject(target, false);
  232.  
  233.         if (object == nullptr){
  234.             creature->sendSystemMessage("Target required for /tool move");
  235.             throw Exception();
  236.         }
  237.  
  238.         if (object->isCreatureObject()){
  239.             creature->sendSystemMessage("Error: Invalid Target. Must not be a creature.");
  240.             throw Exception();
  241.         }
  242.  
  243.         if (adminLevelCheck < 15){
  244.             playerMoveRotateRules(creature, object);
  245.         }
  246.  
  247.         String possibleDirections = "forward back up down";
  248.         String dir = "";
  249.         String dist = "";
  250.         float distance = 0.0;
  251.  
  252.         if(args->hasMoreTokens()){
  253.             args->getStringToken(dir);
  254.             args->getStringToken(dist);
  255.         }
  256.  
  257.         dir = dir.toLowerCase();
  258.  
  259.         if(!possibleDirections.contains(dir))
  260.             throw Exception();
  261.  
  262.         if(dist.isEmpty())
  263.             throw Exception();
  264.  
  265.         try {
  266.             distance = Float::valueOf(dist);
  267.         } catch (const Exception& e) {
  268.             creature->sendSystemMessage("Error: /tool move <direction> [number] was not provided a numerical value.");
  269.         }
  270.  
  271.         //if (distance < 1.f || distance > 500.f){
  272.         //  creature->sendSystemMessage("@player_structure:movefurniture_params"); //The amount to move must be between 1 and 500.
  273.         //  throw Exception();
  274.         //}
  275.  
  276.         float degrees = creature->getDirectionAngle();
  277.         float radians = Math::deg2rad(degrees);
  278.  
  279.         distance /= 100.0f;
  280.  
  281.         float offsetX = distance * sin(radians);
  282.         float offsetY = distance * cos(radians);
  283.  
  284.         float x = object->getPositionX();
  285.         float y = object->getPositionY();
  286.         float z = object->getPositionZ();
  287.  
  288.         if (dir == "forward") {
  289.             x += (offsetX);
  290.             y += (offsetY);
  291.         } else if (dir == "back") {
  292.             x -= (offsetX);
  293.             y -= (offsetY);
  294.         } else if (dir == "up") {
  295.             z += distance;
  296.         } else if (dir == "down") {
  297.             z -= distance;
  298.         }else {
  299.             creature->sendSystemMessage("Error: /tool move command requires using the whole direction word.");
  300.             throw Exception();
  301.         }
  302.  
  303.         object->incrementMovementCounter();
  304.  
  305.         if (object->getParent() != nullptr)
  306.             object->teleport(x, z, y, object->getParent().get()->getObjectID());
  307.         else
  308.             object->teleport(x, z, y);
  309.     }
  310.    
  311.     void teleportItem(CreatureObject* creature, const uint64& target, int adminLevelCheck, StringTokenizer* args) const {
  312.         ManagedReference<SceneObject*> object = server->getZoneServer()->getObject(target, false);
  313.  
  314.         if (object == nullptr){
  315.             creature->sendSystemMessage("Target required for /tool tp");
  316.             throw Exception();
  317.         }
  318.  
  319.         if (object->isCreatureObject()){
  320.             creature->sendSystemMessage("Error: Invalid Target. Must not be a creature.");
  321.             throw Exception();
  322.         }
  323.  
  324.         if (adminLevelCheck < 15){
  325.             //playerMoveRotateRules(creature, object);
  326.             throw Exception();
  327.         }
  328.  
  329.         String possibleDirections = "x y z";
  330.         String axis = "";
  331.         String coord = "";
  332.         float coordinate = 0;
  333.  
  334.         if(args->hasMoreTokens()){
  335.             args->getStringToken(axis);
  336.             args->getStringToken(coord);
  337.         }
  338.  
  339.         axis = axis.toLowerCase();
  340.  
  341.         if(!possibleDirections.contains(axis))
  342.             throw Exception();
  343.  
  344.         if(coord.isEmpty())
  345.             throw Exception();
  346.  
  347.         try {
  348.             coordinate = Float::valueOf(coord);
  349.         } catch (const Exception& e) {
  350.             creature->sendSystemMessage("Error: /tool tp <axis> [coordinate] was not provided a numerical value.");
  351.         }
  352.        
  353.         float x = object->getPositionX();
  354.         float y = object->getPositionY();
  355.         float z = object->getPositionZ();
  356.        
  357.         if(axis == "x") {
  358.             x = coordinate;
  359.         } else if (axis == "y") {
  360.             y = coordinate;
  361.         } else if (axis == "z") {
  362.             z = coordinate;
  363.         } else {
  364.             creature->sendSystemMessage("Error: /tool tp command requires x, y, or z for an axis.");
  365.             throw Exception();
  366.         }
  367.        
  368.         object->incrementMovementCounter();
  369.  
  370.         if (object->getParent() != nullptr)
  371.             object->teleport(x, z, y, object->getParent().get()->getObjectID());
  372.         else
  373.             object->teleport(x, z, y);
  374.     }
  375.    
  376.     void alignToObject(CreatureObject* creature, const uint64& target, int adminLevelCheck, StringTokenizer* args) const {
  377.         ManagedReference<SceneObject*> object = server->getZoneServer()->getObject(target, false);
  378.  
  379.         if (object == nullptr){
  380.             creature->sendSystemMessage("Target required for /tool tp");
  381.             throw Exception();
  382.         }
  383.  
  384.         if (object->isCreatureObject()){
  385.             creature->sendSystemMessage("Error: Invalid Target. Must not be a creature.");
  386.             throw Exception();
  387.         }
  388.        
  389.         if (adminLevelCheck < 15){
  390.             //playerMoveRotateRules(creature, object);
  391.             throw Exception();
  392.         }
  393.        
  394.        
  395.         creature->setDirection(object->getDirection()->getX(),object->getDirection()->getY(),object->getDirection()->getZ(),object->getDirection()->getW());
  396.         // Apply rotation
  397.         creature->incrementMovementCounter();
  398.         if (object->getParent() != nullptr)
  399.             creature->teleport(object->getPositionX(), object->getPositionZ(), object->getPositionY(), object->getParent().get()->getObjectID());
  400.         else
  401.             creature->teleport(object->getPositionX(), object->getPositionZ(), object->getPositionY());
  402.     }
  403.    
  404.     // Rules for player use of rotate and move
  405.     // Allow Inside: rotate any non-creature object, if on admin list.
  406.     // Allow Outside: rotate only LoH specific decor and only when it's in Mos Espa.
  407.     void playerMoveRotateRules(CreatureObject* creature, SceneObject* object) const {
  408.         ManagedReference<SceneObject*> objParent = object->getParent().get(); // Should be a CellObject or nullptr if outside
  409.  
  410.         if (objParent) { // Inside
  411.             ManagedReference<SceneObject*> objParentParent = objParent->getParent().get();
  412.  
  413.             if (objParentParent->isBuildingObject()){
  414.                 ManagedReference<BuildingObject*> building = cast<BuildingObject*>( objParentParent.get());
  415.  
  416.                 //Is this player on the permission list?
  417.                 if (!building->isOnAdminList(creature)){
  418.                     creature->sendSystemMessage("@player_structure:must_be_admin"); //You must be a building admin to do that.
  419.                     throw Exception();
  420.                 }
  421.             } else if (!objParentParent->isBuildingObject()){
  422.                 creature->sendSystemMessage("Error: Invalid location."); // Player is in a cell that is not inside a building - should not happen
  423.                 throw Exception();
  424.             }
  425.         } else { // Outside
  426.             String templateFile = object->getObjectTemplate()->getFullTemplateString();
  427.  
  428.             if (!templateFile.contains("hondo/decoration")){
  429.                 creature->sendSystemMessage("Error: Invalid Target. Must be a Legend of Hondo exterior decoration.");
  430.                 throw Exception();
  431.             }
  432.  
  433.             Zone* zone = object->getZone();
  434.             PlanetManager* planetManager = zone->getPlanetManager();
  435.             CityRegion* cityRegion = planetManager->getRegionAt(object->getWorldPositionX(), object->getWorldPositionY());
  436.             String regionName = "";
  437.  
  438.             if (cityRegion != nullptr)
  439.                 regionName = cityRegion->getRegionName();
  440.  
  441.             if (regionName != "@tatooine_region_names:mos_espa"){
  442.                 creature->sendSystemMessage("Error: Must be in Mos Espa to move/rotate exterior objects.");
  443.                 throw Exception();
  444.             }
  445.         }
  446.     }
  447.    
  448.     void tjtMove(CreatureObject* creature, const uint64& target, int adminLevelCheck, StringTokenizer* args) const {
  449.         ManagedReference<SceneObject*> object = server->getZoneServer()->getObject(target, false);
  450.        
  451.         if (object == nullptr){
  452.             creature->sendSystemMessage("Target required for /tool tjt");
  453.             throw Exception();
  454.         }
  455.  
  456.         if (object->isCreatureObject()){
  457.             creature->sendSystemMessage("Error: Invalid Target. Must not be a creature.");
  458.             throw Exception();
  459.         }
  460.  
  461.         if (adminLevelCheck < 15){
  462.             playerMoveRotateRules(creature, object);
  463.         }
  464.        
  465.         float x, y, z, rW, rX, rY, rZ;
  466.        
  467.         if(args->hasMoreTokens()){
  468.             x = args->getFloatToken();
  469.             y = args->getFloatToken();
  470.             z = args->getFloatToken();
  471.             rW = args->getFloatToken();
  472.             rX = args->getFloatToken();
  473.             rY = args->getFloatToken();
  474.             rZ = args->getFloatToken();
  475.         }
  476.        
  477.         object->setDirection(rW, rX, rY, rZ);
  478.        
  479.         if (object->getParent() != nullptr)
  480.             object->teleport(x, y, z, object->getParent().get()->getObjectID());
  481.         else
  482.             object->teleport(x, y, z);          
  483.     }
  484.  
  485.    
  486. };
  487.  
  488. #endif //TOOLCOMMAND_H_
  489.  
RAW Paste Data