Krebante's Slime Trainer

This is a working and easy to use slime trainer. The only values you ever need to edit are at the top under const.

const
   StrongWeaponID = 1111; //The weapon that will be used to kill the mother slime
   WeakWeaponID = 1111; //The weapon that will be used to train
   MinCreatures = 3; //The minimum amount of creatures attacking you to kill the mother slime to avoid shieldbreaking
   MaxTime = [5,0,0]; //The maximum training time (hours, minutes, seconds)
   MinHP = 200; // The HP you need to have to kill the mother slime

function GetItemFromOpenBackpack(ID: Integer): TItem;
begin
   UpdateWorld;
   Result := nil;
   for x := 0 to Self.Containers.Count - 1 do
   begin
      for y := 0 to Self.Containers.Container[x].Count - 1 do
      begin
         if Self.Containers.Container[x].Item[y].ID = ID then
            Result := Self.Containers.Container[x].Item[y];
      end;
   end;
end;

function GetNumberOfAttackingCreatures: Integer;
begin
   UpdateWorld;
   Result := 0;
   for x := 0 to Creatures.Count - 1 do
   begin
      if (Abs(Creatures.Creature[x].X - Self.X) <= 1) and
       (Abs(Creatures.Creature[x].Y - Self.Y) <= 1) and
       (Creatures.Creature[x].Z = Self.Z) and
       Creatures.Creature[x].NPC then
         Result := Result + 1;
   end;
end;

function AttackCreatureByID(ID: Integer);
begin
   UpdateWorld;
   for x := 0 to Creatures.Count - 1 do
   begin
      if Creatures.Creature[x].ID = ID then
         Creatures.Creature[x].Attacking := True;
   end;
end;

var
   MotherSlime, X1, Y1: Integer;
   Finished: Boolean;
   StartTime: Float;
   MaxSeconds: Integer;
   Item: TItem;
begin
   UpdateWorld;
   MotherSlime := Self.Following;
   Finished := False;
   StartTime := Time;
   MaxSeconds := (MaxTime[0] * 3600) + (MaxTime[1] * 60) + MaxTime[2];
   if MotherSlime = 0 then
   begin
      Self.DisplayText('Mother slime not found! Please follow it and then execute the script.');
      Finished := True;
   end;
   while (not Terminated) and (not Finished) do
   begin
      UpdateWorld;
      if GetNumberOfAttackingCreatures >= MinCreatures then
      begin
         Item := GetItemFromOpenBackpack(StrongWeaponID);
         if Item <> nil then
         begin
            if Self.RightHand = WeakWeaponID then
               Item.MoveToBody(Self.RightHand, 0);
            else
               Item.MoveToBody(Self.LeftHand, 0);
         end;
         AttackCreatureByID(MotherSlime);
         Self.DisplayText('There are too many creatures around you. Exiting script.');
         Finished := True;
      end;
      if StartTime + (MaxSeconds / 100000) <= FloatToStr(Time) then
      begin
         Item := GetItemFromOpenBackpack(StrongWeaponID);
         if Item <> nil then
         begin
            if Self.RightHand = WeakWeaponID then
               Item.MoveToBody(Self.RightHand, 0);
            else
               Item.MoveToBody(Self.LeftHand, 0);
         end;
         AttackCreatureByID(MotherSlime);
         Self.DisplayText('You have trained for too long. Exiting script.');
         Finished := True;
      end;
      if Self.Health <= MinHP then
      begin
         Item := GetItemFromOpenBackpack(StrongWeaponID);
         if Item <> nil then
         begin
            if Self.RightHand = WeakWeaponID then
               Item.MoveToBody(Self.RightHand, 0);
            else
               Item.MoveToBody(Self.LeftHand, 0);
         end;
         AttackCreatureByID(MotherSlime);
         Self.DisplayText('Your health is too low. Exiting script.');
         Finished := True;
      end;
      if not Self.Attacking then
      begin
         UpdateWorld;
         for x := 0 to Creatures.Count - 1 do
         begin
            UpdateWorld;
            if Creatures.Creature[x].ID <> MotherSlime then
            begin
               if (Creatures.Creature[x].Name <> Self.Name) and Creatures.Creature[x].NPC then
               begin
                  UpdateWorld;
                  X1 := Creatures.Creature[x].X;
                  Y1 := Creatures.Creature[x].Y;
                  Z1 := Creatures.Creature[x].Z;
                  if (Abs(X1 - Self.X) <= 1) and (Z1 = Self.Z) then
                  begin
                     UpdateWorld;
                     if (Abs(Y1 - Self.Y) <= 1) and (Z1 = Self.Z) then
                     begin
                        Creatures.Creature[x].Attacking := true;
                        Break;
                     end;
                  end;
               end;
            end;
         end;
      end;
      Sleep(1000);
   end;
end;
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License