Hi all,
I'd like to seek for your advice on the issues I cannot resolve by myself after spent many time on trail and error.
I want to develop an auto walker which can achieve following features:
- Judge if the room already has a player or mob(s) I want to kill
- If there is a player entered the room before my char does, then my char will directly move to the next room
- If no player in the room but the mob(s) I want to kill are there, my char will fight with the mob, then move to the next room after the mob(s) are killed
- If a player enters the room later than my char, my char will continue fighting with the mob(s) in the room instead of moving to the next room
I referred to Nick's reply in this post to have the auto walker as the base (the 3rd reply)
https://gammon.com.au/forum/?id=8613&reply=3#reply3
Plus the function to judge player/mob following Nick and Fiendish's instruction in this post (thanks for the great guidance again!)
https://gammon.com.au/forum/?id=14987
Then come out my codes as below (separate in several parts for easy reading; some words in Chinese since the MUD I play is in Chinese):
Auto walker by timer
<timers>
<timer second="2.75" offset_second="0.00" send_to="12"
group="潛能1" >
<send>route_check()
pplroom = nil
EnableTrigger("check_player", true)
Note(pplroom)
Note(fighting)
Note(loc)
-- stay here if we are fighting or recovering
if fighting then
return
end -- if
loc = (loc or 0) + 1 -- next way to walk
-- if past end, go to next wave
if loc > #route then
loc = 0
pot_wave = GetVariable("pot_wave") + 1
SetVariable("pot_wave", pot_wave)
next_wave = pot_wave + 1
if route_current[pot_wave] then
DoAfterSpecial(2, 'Execute("move " .. next_wave)', 12)
else
route_check()
Execute("move 1;exert force;deposit 10000 coin")
DoAfterSpecial(8, 'Execute("deposit 100 silver")', 12)
--DoAfterSpecial(8, 'Execute("w;s;w")', 12)
loc=0
timer_end("潛能1")
--timer_start("練武")
end -- if
else
DoAfterSpecial(1, 'Send(route [loc])', 12)
Note(fighting)
end -- if</send>
</timer>
</timers>
Trigger used to judge player/mob then define "fighting" is true of false
<triggers>
<trigger
group="查玩家"
match="^[> ]*.*\((?P<char_name>.*)\).*$"
name="check_player"
regexp="y"
send_to="12"
sequence="100"
>
<send>Char_Name = string.lower("%1")
pplroom = find_in_list(Char_Name, players)
if pplroom then
fighting = false
Note ("Warning, player " .. pplroom .. " here.")
EnableTrigger("check_player", false)
return
else
mobroom = find_in_list(Char_Name, mobs)
if mobroom then
fighting = true
Execute ("say Mob " .. mobroom .. " here.")
EnableTrigger("check_player", false)
timer_end("潛能1")
else
fighting = false
end -- if
end -- if</send>
</trigger>
</triggers>
Trigger to re-active the timer
<triggers>
<trigger
custom_colour="2"
enabled="y"
group="統計"
match="^吒]為你殺死了(.*),得到了\s+(\d+)點經驗值和\s+(\d+)點潛能以及\s+(\d+)點聲望。$"
regexp="y"
send_to="12"
sequence="100"
>
<send>
-- check state --
EnableTrigger("check_player", true)
check_state ()
DoAfterSpecial (0.5, 'heal()',12)
DoAfterSpecial (0.75, 'pot_threshold()',12)
timer_start("潛能1")</send>
</trigger>
</triggers>
Some self-defined functions used (less relevant ones are excluded)
function find_in_list(find_what, the_list)
for k, v in pairs(the_list) do
if find_what:lower() == k:lower() then
return k
end -- if
end -- for
end -- function
function pot_threshold()
if my_pot > 150 then
timer_end ("潛能1")
-- trigger_end ("潛能1")
fighting = false
loc = 0
Execute ("move 1")
DoAfterSpecial (1, 'timer_start("學習")',12)
else
Execute ("look")
end -- if
end -- function
function frozen_blade()
Execute ("wield blade;perform blade.kill;unwield blade")
end -- function
Issues bumped
- The walker usually works fine, while sometimes it makes my char move to the next room when the fighting is still on-going
- Once my char moves as mentioned in #1, since the walker has already been temporarily turned off, my char will be idled there until the timer is fired by another trigger after 15 mins
- If another player enter the room after my char, when my char sees the player, the timer will move my char into the next room - this is not the ideal behavior I want
May I have your help/guidance on the possible solutions? Thanks in advance. |