Daniel P. Barron

Craft Bot Replace Tool

Tuesday, May 9, 2017 

I don't think this code works and I'm not sure why. I know it was working at some point but with all the other client updates it has since stopped.


Here's how to make your FoxyBot change worn out tools during a craft run. This is not a simple fix. Please read carefully.


First, open up botactivity.h and add this to the protected section of the CraftActivity class.

        void DoReplaceTool();

While you're in that file, also add this to the private section of the same class.

        bool needToReplaceTool;
        pawsSlot* toolSlot;             //for worn-out tools

And add this constant to enum CRAFT_ACTIONS.

CRAFTING_REPLACE_TOOL = 27,

Write the file and open up botactivity.cpp ; add this function somewhere among the other CraftActivity functions.

void CraftActivity::DoReplaceTool()
{
        if (needToReplaceTool)
        {
                toolName = rcp.GetToolName();

                if (toolSlot == NULL)
                        toolSlot = worldHandler::GetNextFreeInvSlot();

                if (toolName == "Chair for the Head" || toolName == "Pincered Skullcap")
                        worldHandler::MoveItems(CONTAINER_INVENTORY_EQUIPMENT, PSCHARACTER_SLOT_HELM, toolSlot->ContainerID(), toolSlot->ID(), 1);
                else if (toolName == "Demeaning Urabihs Harness")
                        worldHandler::MoveItems(CONTAINER_INVENTORY_EQUIPMENT, PSCHARACTER_SLOT_TORSO, toolSlot->ContainerID(), toolSlot->ID(), 1);
                else if (toolName == "Penance Clogs")
                        worldHandler::MoveItems(CONTAINER_INVENTORY_EQUIPMENT, PSCHARACTER_SLOT_BOOTS, toolSlot->ContainerID(), toolSlot->ID(), 1);

                worldHandler::Equip(toolName);
                needToReplaceTool = false;
        }
}

Add this case to the switch in CraftActivity::Perform.

                case CRAFTING_REPLACE_TOOL:
                {
                        DoReplaceTool();
                        NextAction(2*MIN_DELAY);
                        break;
                }

Put these somewhere at the top of CraftActivity::DoInit().

        needToReplaceTool = false;
        toolSlot = NULL;

And another case in CraftActivity::NextAction.

        case CRAFTING_REPLACE_TOOL:
        {
                if (!needToReplaceTool)
                        actionToDo = CRAFTING_INIT;
                break;
        }

And finally, change this else if in CraftActivity::HandleMessage.

                        else if (text.StartsWith(TOOL_WORN))
                        {
                                OutputMsg("Tool worn-out; will try to replace it.");

                                needToReplaceTool = true;
                                DoReplaceTool();
                                if (!worldHandler::TargetEID(containerEID))
                                {
                                        OutputMsg(csString("Could not find container within reach!"));
                                        Error();
                                        break;
                                }

                                csString contName = worldHandler::GetTargetName().Collapse();
                                if (!contName.CompareNoCase(rcp.GetContainerName()))
                                {
                                        OutputMsg(rcp.GetContainerName());
                                        OutputMsg(contName);
                                        OutputMsg(csString("Wrong container targeted! Kindly target the right container for the task and /bot craft again."));
                                        Error();
                                        break;
                                }

                                if (!worldHandler::OpenTarget())
                                {
                                        OutputMsg(csString("Could not open the container!"));
                                        Error();
                                        break;
                                }
                                worldHandler::UseTarget();
                        }

Save that file, change directory to ~/development/EuloraV0.1.2 and run jam -aq client to recompile the changes.

Leave a Reply

Your criticism is welcome. Your name and website are optional. Some HTML tags are allowed.