ScriptUO

Official ScriptUO EasyUO Scripts => Script Debug => Topic started by: Meatt Wad on October 06, 2011, 12:08:19 PM

Title: Meatt Wad's First attempt at a full script
Post by: Meatt Wad on October 06, 2011, 12:08:19 PM
     When I played UO a couple years ago and farther back, I became pretty good at taking scripts and modifying them to suit my needs.  However I really have no clue how to script myself.  I have read the tutorials here and have decided to take a shot at a fairly simple script and I am struggling to get it to work.
     I have used many scripts and have studied how those scripts made things happen, I have a limited understanding for what is going on. I can script for the most part in a straight line.  Where i tell it do this then this etc. etc.(uoap or uoa for example).    Its the subs and goto type stuff that i find confusing. I have made my script work the way I want in a linear fashion but I dont like it as its not versatile and changeable like the scripts made here.
     I have decided to make a simple begging script (halloween and all), to test my understanding.  I want it to Find target, use begging, select target, and repeat basically.  I also want to have a menu that displays at least current skill and number of gains.  I have used many scripts as references and have written my own script.
Can I post this script here to receive advice on how to fix it, tweak it improve it etc. ??
I dont care about publishing it unless I am asked to.
I just need to get script 1 under my belt so I have a toy to learn on.
Title: Re: Meatt Wad's First attempt at a full script
Post by: Endless Night on October 06, 2011, 08:57:56 PM
Quote
Can I post this script here to receive advice on how to fix it, tweak it improve it etc. ??

Most defiantly ...  post it here in this thread with a question and one of us is bound to jump right in
Title: Re: Meatt Wad's First attempt at a full script
Post by: Meatt Wad on October 07, 2011, 06:34:12 AM
Thanks Endless.  Well here it is. I use it in my house to train up begging. Its slow with no tricks just a simple beg and repeat.
Code: [Select]
;==================================
; Script Name:  Meatt Wad's Simple Beggar
; Author: Meatt Wad
; Version: .1
; Client Tested with: 7.0.18
; EUO version tested with: 1.5.202
; Shard OSI: OSI
; Revision Date: Oct 6, 2011
; Public Release:
; Purpose: Automate Begging
; Globals: none
;====================================
;
;====================================
; Instructions: Find a heavily populated area of NPC's or better yet . . .
; Go Hire Blue NPC's, fighters, beggar's whatever(15 to 20 should do), has to be the ones you pay to follow you.
; Take them to your house and trap them (I like walking them up to third floor and leaving a hole to 2nd
; Allow them to fall through to 2nd floor with no doors and no teles no stairs so they can't escape.)
; I also like to make this room fairly small like 8x8 or less so they are within begging range.
;====================================
; Special thanks to everyone at SUO for all the help!
;====================================

set %ver 0.1

chooseskill BEGGING
set %skill #skill
set %BEGGING #skill
set %gain 0
set %gains 0
set %status Begging
menu show 290 112
menu hideEUO
gosub menu


REPEAT

gosub find
gosub beg



until #charghost = yes
set %status = Dead
gosub menu
display You are Dead! Script Halted!
halt



;============ find sub =============

sub find
finditem HS_IS G_10
if #FINDKIND = -1
{
  ignoreitem reset
  gosub find
}
if #FINDID = #CHARID
{
  ignoreitem #FINDID
  gosub find
}

;============beg sub ===============

sub beg
move #FINDX #FINDY 1 10s
finditem #FINDID
if #FINDDIST > 1
{
  ignoreitem #FINDID
 return
}
chooseskill BEGGING
set %skill #SKILL
set #LTARGETID #FINDID
set #LTARGETKIND 1
event macro 13 6
target
event macro 22
wait 10s
chooseskill BEGGING
if %skill < #SKILL
{
  finditem #FINDID
  gosub beg
}
ignoreitem #FINDID
gosub skillgain
return

;=============Skillgain sub============

sub skillgain
chooseskill BEGGING
if #skill = #skillcap
   {
  display You have reached your skill cap.$
            +$Thanx for using Meatt Wad's Simple Begger
            +$
            +$Please rate the script.
            +$
            +$
            +Script is Halted$
            +$
            + ~ Meatt Wad$
   halt
   }
if #skill > %BEGGING
  set %gains %gains + #skill - %BEGGING
set %BEGGING #skill
gosub menu
return

;
;--------- EasyUO Menu Designer Code Begin ---------

sub menu
menu Clear
menu Window Title MeattWads Simple Beggar %ver
menu Window Color Black
menu Window Size 290 112
menu Font Transparent #true
menu Font Align Right
menu Font Name MS Sans Serif
menu Font Size 14
menu Font Style
menu Font Color $9933CC
menu Font Transparent #false
menu Font Align Left
menu Font BGColor Black
menu Text EUOLabel1 10 40 Gains:
menu Text EUOLabel2 10 72 Status:
menu Font Size 8
menu Text EUOLabel3 70 80 %status
str len %gains
str ins %gains #dot #strRes
menu Text EUOLabel4 70 48 #strRes
menu Font Size 14
menu Text EUOLabel5 22 10 Skill:
menu Font Size 8
str len #skill
str ins #skill #dot #strRes
menu Text EUOLabel6 70 18 #strRes
return
;--------- EasyUO Menu Designer Code End ---------

I actually have it working now, so just looking for advice for better coding, better functionality etc.
I use this in my house in a room roughly 8x8 so I comment out the line in the beg sub that moves.

Any and all advice is welcome, Im just wanting to learn to write a better script.
Title: Re: Meatt Wad's First attempt at a full script
Post by: Endless Night on October 07, 2011, 06:59:54 AM
in that case heres some feed back .. take what you want from it and most importantly dont get offended.. use as a learning experience

-Firstly I find it usefull to indent my code 2 spaces per grouping this makes it easier to read... see what i did below
-I stripped your comments purely to make it shorter and easier to read here.. leave them in your original version
-ALL SUBS must exit via a RETURN...
- use loop commands like  For, Repeat..Until, While  instead of GOTO .. makes your code easier to debug
- Moved some subs into the main loop.  This a good practice to list the things it does one after another and put that into your main loops vers  loop A   A calls B b calls C call d  d calls  E ... thats hard to debug as its hard to follow   a loop of  ABCDE is easy to see whats happening.
- You dont have to redraw the menu entirely to change one item,  lookup the menu set command its faster and elimates and menu flashing from destroying and redrawing.
- Other edits see if they make sense to you

NOTE ALL untested edits...

Code: [Select]
set %ver 0.1

chooseskill BEGGING   ; shouldnt this be only a 4 letter code
set %skill #skill
set %BEGGING #skill
set %gain 0
set %gains 0
set %status Begging
menu show 290 112
menu hideEUO
gosub menu

REPEAT
  gosub find
  gosub beg
  gosub skillgain
  gosub UpdateMenu
until #charghost = yes  || #Skill = #Skillcap
halt


sub UpdateMenu
  str len %gains
  str ins %gains #dot #strRes
  menu set EUOLabel4 #strRes
  str len #skill
  str ins #skill #dot #strRes
  menu set EUOLabel6  #strRes    ; no need to redraw entire menu to set current skill
  menu set EUOLabel3 %status

  if #Charghost = yes
    display You are Dead! Script Halted!
return



sub find
  repeat
    wait 1 ; Give your machine a chance to catch up on tasks
    finditem HS_IS G_10        
    if #findcnt = 0
        ignore reset
    if #findid = #charid
        ignoreitem #FINDID
  until #FINDcnt = 1 && #findid <> #charid   ; findcnt = number of items found
RETURN  ; must must return from a sub

;============beg sub ===============

sub beg
  move #FINDX #FINDY 1 10s
  ignoreitem #FINDID    ; stops it being found on the next search has no effect on current search results
  if #FINDDIST > 1
    return
  Repeat   ; begging loop
    chooseskill BEGGING
    set %skill #SKILL
    set #LTARGETID #FINDID
    set #LTARGETKIND 1
    event macro 13 6
    target
    event macro 22
    wait 10s
    chooseskill BEGGING
  until %skill >=  #skill   ; note sure on objective so not sure if this logic correct... its a correct rendition of your logic but was that right ?
return

;=============Skillgain sub============

sub skillgain
  chooseskill BEGGING
  if #skill > %BEGGING
    set %gains %gains + #skill - %BEGGING
  set %BEGGING #skill

  if #skill = #skillcap
     {
    display You have reached your skill cap.$
            +$Thanx for using Meatt Wad's Simple Begger
            +$
            +$Please rate the script.
            +$
            +$
            +Script is Halted$
            +$
            + ~ Meatt Wad$
     }
return

;
;--------- EasyUO Menu Designer Code Begin ---------

sub menu
  menu Clear  
  menu Window Title MeattWads Simple Beggar %ver
  menu Window Color Black
  menu Window Size 290 112
  menu Font Transparent #true
  menu Font Align Right
  menu Font Name MS Sans Serif
  menu Font Size 14
  menu Font Style
  menu Font Color $9933CC
  menu Font Transparent #false
  menu Font Align Left
  menu Font BGColor Black
  menu Text EUOLabel1 10 40 Gains:
  menu Text EUOLabel2 10 72 Status:
  menu Font Size 8
  menu Text EUOLabel3 70 80 %status
  str len %gains
  str ins %gains #dot #strRes
  menu Text EUOLabel4 70 48 #strRes
  menu Font Size 14
  menu Text EUOLabel5 22 10 Skill:
  menu Font Size 8
  str len #skill
  str ins #skill #dot #strRes
  menu Text EUOLabel6 70 18 #strRes
return
;--------- EasyUO Menu Designer Code End ---------

Title: Re: Meatt Wad's First attempt at a full script
Post by: Meatt Wad on October 07, 2011, 07:20:31 AM
Thank you for such a quick response. Messing around with  your suggestions right now
Title: Re: Meatt Wad's First attempt at a full script
Post by: Endless Night on October 07, 2011, 07:31:57 AM
Thank you for such a quick response. Messing around with  your suggestions right now

your welcome ... I've got to tell you, you are doing pretty dam fantastic for your first script.
Title: Re: Meatt Wad's First attempt at a full script
Post by: Meatt Wad on October 07, 2011, 07:47:18 AM
Gets Stuck looping in your find sub.

Code: [Select]
sub find
  repeat
    wait 1 ; Give your machine a chance to catch up on tasks
    finditem HS_IS G_10        
    if #findcnt = 0
        ignore reset
    if #findid = #charid
        ignoreitem #FINDID
  until #FINDcnt = 1 && #findid <> #charid   ; findcnt = number of items found
RETURN  ; must must return from a sub


not sure how this line works as far as moving the script on, could you explain a little more to me, it appears this line is causing the loop when I f7 through the script.
Code: [Select]
until #FINDcnt = 1 && #findid <> #charid   ; findcnt = number of items found

Thanks again for the lessons. Most of it makes sense to me and my script is definitely prettier  ;D

PS.   #FINDcnt is returning 14    which is the number of npcs in my house not including me
Title: Re: Meatt Wad's First attempt at a full script
Post by: Meatt Wad on October 07, 2011, 07:58:56 AM
Thank you for such a quick response. Messing around with  your suggestions right now

your welcome ... I've got to tell you, you are doing pretty dam fantastic for your first script.
Well Thank You, I just pay attention to how you guys do things and try to mimic in an effort to learn how and why.
Title: Re: Meatt Wad's First attempt at a full script
Post by: Meatt Wad on October 07, 2011, 08:03:38 AM
OK I changed this:

Code: [Select]
until #FINDcnt = 1 && #findid <> #charid   ; findcnt = number of items found


to this:
Code: [Select]
until #FINDcnt > 1 && #findid <> #charid   ; findcnt = number of items found


That sound about right?
Title: Re: Meatt Wad's First attempt at a full script
Post by: Meatt Wad on October 07, 2011, 09:03:01 AM
OK. . . through some trial and error I think I got this down now. First I changed the Find sub to read:
Code: [Select]
sub find
  repeat
    wait 1
    finditem HS_IS G_10       
    if #findcnt = 0
        ignoreitem reset ;fixed this
    if #findid = #charid
        ignoreitem #FINDID
  until #FINDcnt >= 1 && #findid <> #charid  ;fixed this i think
RETURN 
Took me a bit to figure out the ignoreitem reset, and I think the "until" line is good now with a >= ( I understand what is happening here now.)


Title: Re: Meatt Wad's First attempt at a full script
Post by: Endless Night on October 07, 2011, 09:06:23 AM
lol you got it .. >=   
Title: Re: Meatt Wad's First attempt at a full script
Post by: Meatt Wad on October 07, 2011, 09:07:22 AM
And now I have this:
Code: [Select]
;==================================
; Script Name:  Meatt Wad's Simple Beggar
; Author: Meatt Wad
; Version: 0.2
; Client Tested with: 7.0.18
; EUO version tested with: 1.5.202
; Shard OSI: OSI
; Revision Date: Oct 6, 2011
; Public Release:
; Purpose: Automate Begging
; Globals: none
;====================================
;
;====================================
; Instructions: Find a heavily populated area of NPC's or better yet . . .
; Go Hire Blue NPC's, fighters, beggar's whatever(15 to 20 should do), has to be the ones you pay to follow you.
; Take them to your house and trap them (I like walking them up to third floor and leaving a hole to 2nd
; Allow them to fall through to 2nd floor with no doors and no teles no stairs so they can't escape.)
; I also like to make this room fairly small like 8x8 or less so they are within begging range.
;====================================
; Thanks to everyone at SUO for all the help!
;====================================
; Special thanks to Endless Night for sharing your knowledge with me and helping to edit this script!
;====================================

set %ver 0.2

chooseskill BEGG  
set %skill #skill
set %BEGG #skill
set %gain 0
set %gains 0
set %status Begging
menu show 290 112
menu hideEUO
gosub menu

;======== Main Loop ================

REPEAT
  gosub find
  gosub beg
  gosub skillgain
  gosub UpdateMenu
until #charghost = yes  || #Skill = #Skillcap
halt

;======== Update Menu Sub ===========

sub UpdateMenu
  str len %gains
  str ins %gains #dot #strRes
  menu set EUOLabel4 #strRes
  str len #skill
  str ins #skill #dot #strRes
  menu set EUOLabel6  #strRes  
  menu set EUOLabel3 %status

  if #Charghost = yes
    display You are Dead! Script Halted!
return

;============= Find Sub ==========

sub find
  repeat
    wait 1
    finditem HS_IS G_10        
    if #findcnt = 0
        ignoreitem reset
    if #findid = #charid
        ignoreitem #FINDID
  until #FINDcnt >= 1 && #findid <> #charid  
RETURN  

;============ Beg Sub ===============

sub beg
  move #FINDX #FINDY 1 10s
  ignoreitem #FINDID    
  if #FINDDIST > 1
    return
  Repeat  
    chooseskill BEGG
    set %skill #SKILL
    set #LTARGETID #FINDID
    set #LTARGETKIND 1
    event macro 13 6
    target
    event macro 22
    wait 10s
return

;=============Skillgain sub============

sub skillgain
  chooseskill BEGG
  if #skill > %BEGG
    set %gains %gains + #skill - %BEGG
  set %BEGG #skill

  if #skill = #skillcap
     {
    display You have reached your skill cap.$
            +$Thanx for using Meatt Wad's Simple Begger
            +$
            +$Please rate the script at ScriptUO.com
            +$
            +$
            +Script is Halted$
            +$
            + ~ Meatt Wad$
     }
return

;=========== EasyUO Menu Designer Code ============

sub menu
  menu Clear  
  menu Window Title MeattWads Simple Beggar %ver
  menu Window Color Black
  menu Window Size 290 112
  menu Font Transparent #true
  menu Font Align Right
  menu Font Name MS Sans Serif
  menu Font Size 14
  menu Font Style
  menu Font Color $9933CC
  menu Font Transparent #false
  menu Font Align Left
  menu Font BGColor Black
  menu Text EUOLabel1 10 40 Gains:
  menu Text EUOLabel2 10 72 Status:
  menu Font Size 8
  menu Text EUOLabel3 70 80 %status
  str len %gains
  str ins %gains #dot #strRes
  menu Text EUOLabel4 70 48 #strRes
  menu Font Size 14
  menu Text EUOLabel5 22 10 Skill:
  menu Font Size 8
  str len #skill
  str ins #skill #dot #strRes
  menu Text EUOLabel6 70 18 #strRes
return

;====================================================
Any more Ideas on improving this.  It is definitely prettier and more organized, runs  alot smoother.  Thank You Endless this is starting to be fun :)
Title: Re: Meatt Wad's First attempt at a full script
Post by: camotbik on October 14, 2011, 03:51:30 AM
In sub beg, you have a starting - never ending "repeat" and few not really req lines.
Code: [Select]
sub beg
  move #FINDX #FINDY 1 10s
  ignoreitem #FINDID
  if #FINDDIST > 1
    return
  Repeat < --------------
    set #LTARGETID #FINDID
    set #LTARGETKIND 1
   chooseskill BEGG < ---- you dont need this
    set %skill #SKILL < ---- you dont need this
    event macro 13 6
    target
    event macro 22
    wait 10s
  return


I can show you an example how i would do it .

A change in mainloop.
Code: [Select]
repeat
  gosub Find
  gosub Skillgain
  gosub UpdateMenu
until #charghost = yes || #Skill = #Skillcap
halt
Then a change in these two subs
Code: [Select]
Sub Find
  ignoreitem #charid
  finditem HS_IS G_10
  for #findindex 1 #findcnt
    gosub beg
return

Sub Beg
  if #finddist > 1
    move #FINDX #FINDY 1 10s
  set #LTARGETID #FINDID
  set #LTARGETKIND 1
  event macro 13 6
  target
  event macro 22
  wait 10s
return

Keep on trying and reading the manual.

ps; if you dont understand the #findindex loop, below is a bit longer version of the same loop

Code: [Select]
ignoreitem #charid
finditem HS_IS G_10
while #findcnt >  0
{
  ignoreitem #findid
  gosub beg
  finditem HS_IS G_10
}
ignoreitem reset
Title: Re: Meatt Wad's First attempt at a full script
Post by: Meatt Wad on October 14, 2011, 03:07:16 PM
Thanks Cam. I will play around with that and see if I get it.
Title: Re: Meatt Wad's First attempt at a full script
Post by: camotbik on December 06, 2011, 02:18:48 PM
There's been a while, have you managed to get things working?