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 words may be altered or altogether purged in accordance with my preference to abstain from publishing statements that may be unnecessarily offensive to other readers. Your criticism is welcome.