Notice: Any messages purporting to come from this site telling you that your password has expired, or that you need to verify your details, confirm your email, resolve issues, making threats, or asking for money, are
spam. We do not email users with any such messages. If you have lost your password you can obtain a new one by using the
password reset link.
Entire forum
➜ MUSHclient
➜ Lua
➜ Infinite Loop?
It is now over 60 days since the last post. This thread is closed.
Refresh page
Pages: 1 2
Posted by
| tobiassjosten
Sweden (79 posts) Bio
|
Date
| Fri 29 Apr 2005 08:48 AM (UTC) Amended on Fri 29 Apr 2005 09:02 AM (UTC) by tobiassjosten
|
Message
| I think I'm getting stuck in a infinite loop or something, as MUSHclient keeps crashing on me when I get into a certain mode.. It happens whenever I try to cure an affliction (the curePrompt-function below). All seems to be running as it should, but MC still crashes.. Tried to include some failsafes, to make the cure only being sent once. Here's the functions involved in the crash, somewhat stripped to keep the thread sane.
function curePrompt (name, line, wildcards)
curing = 0
attacked = 0
if (canEat () > 0 and haha ~= 1) then
if aff['paralysis'] ~= nil then
haha = 1
cureHerb ("maidenhair", "emh")
elseif aff['clumsiness'] ~= nil then
haha = 1
cureHerb ("kelp", "eke")
end
else
debugNote ("Cannot eat!")
end
end
function cureHerb (name, line, wildcards)
if line == "eww" then doHerb = "wormwood"
elseif line == "emh" then doHerb = "maidenhair"
end
Send ("outr " .. doHerb)
Send ("eat " .. doHerb)
end
function cureBLostHerb (name, line, wildcards)
if doHerb == wildcards['herb'] then
bHerb = 0
--doHerb = "none"
curing = 1
--EnableTimer("cureBLostHerb", true)
debugNote ("Lost herb balance")
else
debugNote ("Illusion catched, doHerb was " .. doHerb .. "!")
end
end
function cureBGotHerb (name, line, wildcards)
--EnableTimer("cureBLostHerb", false)
if bHerb > 0 then
debugNote ("Illusion catched, allready had herb balance!")
else
debugNote ("Got herb balance")
end
end
function affAdd (name, toxin)
if toxin ~= nil then
if attacked ~= nil then
aff[name] = "yes"
debugNote ("Added affliction: " .. name .. " (was attacked)")
else
debugNote ("Illusion catched, was not attacked")
end
else
aff[name] = "yes"
debugNote ("Added affliction: " .. name)
end
end
function affDel (name)
if curing ~= nil then
aff[name] = nil
debugNote ("Removed affliction: " .. name)
else
debugNote ("Illusion catched, no cured detected")
end
end
function cureAttacked (weapon)
-- Check for rebound and shield
attacked = 1;
debugNote ("Attack noted, toxins possible")
end
function canEat ()
if bHerb == 1 then
if doHerb == "none" then
if aff['anorexia'] ~= 2 then
return 1
end
end
end
return 0
end
And here's the triggers that calls those functions:
<triggers>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^H\:\d+ M\:\d+ E\:\d+ W\:\d+ \<eb\>"
regexp="y"
script="curePrompt"
sequence="100"
>
</trigger>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^You quickly eat (an?|some)( piece of)? (?P<herb>\w+)( (root|flower|seed|leaf|stem|berry))?\.$"
regexp="y"
script="cureBLostHerb"
sequence="100"
>
</trigger>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^You may eat another herb or plant\.$"
regexp="y"
script="cureBGotHerb"
sequence="100"
>
</trigger>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^You concentrate on purging your body of foreign toxins\.$"
regexp="y"
script="cureBLostPurge"
sequence="100"
>
</trigger>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^You have regained the ability to purge your body\.$"
regexp="y"
script="cureBGotPurge"
sequence="100"
>
</trigger>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^Terror takes hold\, as a numb sensation overcomes your body\.$"
regexp="y"
send_to="12"
sequence="100"
>
<send>affAdd("paralysis", true)</send>
</trigger>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^You stumble and it becomes very difficult to concentrate on your coordination\.$"
regexp="y"
send_to="12"
sequence="100"
>
<send>affAdd("clumsiness", true)</send>
</trigger>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^Your paralysis fades and you can move once more\.$"
regexp="y"
send_to="12"
sequence="100"
>
<send>affDel("paralysis")</send>
</trigger>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^You feel coordinated once more\.$"
regexp="y"
send_to="12"
sequence="100"
>
<send>affDel("clumsiness")</send>
</trigger>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^(\w+) pricks you twice in rapid succession with (his|her) dirk\.$"
regexp="y"
send_to="12"
sequence="100"
>
<send>cureAttacked(true)</send>
</trigger>
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^With a lightning-quick motion\, (\w+) slashes you with .+\.$"
regexp="y"
send_to="12"
sequence="100"
>
<send>cureAttacked(true)</send>
</trigger>
</triggers>
What happens is that when I'm afflicted by clumsiness, for example, I send out the "outr wormwood;eat wormwood" and "(DEBUG) Cannot eat!" is outputted. I cannot see what's causing MC to crash! Someone else? |
Simplicity is Divine | http://nogfx.org/ | Top |
|
Posted by
| Tsunami
USA (204 posts) Bio
|
Date
| Reply #1 on Fri 29 Apr 2005 03:03 PM (UTC) |
Message
| I took a quick look over this, and I can't immediatly see the problem. I did notice a couple things though.
1. Your prompt trigger ends with <eb>, which will not always match, if for example, you don't have equilibrium.
2. In order to use your script functions through triggers you are also sending to the world sometimes by putting it through the command parsers, so I assume you have the relevant aliases. Wouldn't it be simpler just to directly call the script functions as you do in some of your other triggers.
3. I have a similar plugin, and I find it unnecessary to recheck if you can cure every time the prompt is captured. Usually simply when herb balance is regained is often enough.
4. I am also unsure as to why your eatherb function is passed both the name of the herb and the alias to eat it? It then finds the name of the herb based on the alias name rather than on the herb name which is apparently also passed to it? Isn't that a bit redundant?
I'll take another look at this later and see if I can find anything. Good luck! | Top |
|
Posted by
| Tsunami
USA (204 posts) Bio
|
Date
| Reply #2 on Fri 29 Apr 2005 07:22 PM (UTC) |
Message
| ok, one thing just occured to me. I think you have a check against this, but you might want to make sure.
As I said in my previous post, you are recheck your herbs every time you get a prompt. Since you get a prompt every line, this is somewhat spammy, computation wise. When you attempt to heal any affliction, this causes you to eat a herb, which sets off another prompt line, ad infinitum.
We'll see if that's it. | Top |
|
Posted by
| Flannel
USA (1,230 posts) Bio
|
Date
| Reply #3 on Fri 29 Apr 2005 07:42 PM (UTC) |
Message
| That wouldn't cause an infinite loop, or rather, if it did, you'd notice it (since it'd be spammy with the server) and provided you get echo from the server regarding being healed or whatever, it's liable to stop anyway (you'll just spam a few times, until the server responds with something about you being healed).
NOTHING of this sort should make Mushclient crash. Have you done any tweaking of the Lua DLLs? Try reinstalling (overtop of your old installation should be fine) to get new fresh files. Anything wrong with the script (especially stuff like this) should just make an error that gets caught by mushclient, definately not crash.
On another note, you said that you get your outr/eat message AND your debug note? At the same time (well, the same time through the subroutine)? Since that shouldn't happen (since there's an if in between them, it should do one, or the other). |
~Flannel
Messiah of Rose
Eternity's Trials.
Clones are people two. | Top |
|
Posted by
| tobiassjosten
Sweden (79 posts) Bio
|
Date
| Reply #4 on Fri 29 Apr 2005 10:11 PM (UTC) Amended on Fri 29 Apr 2005 10:58 PM (UTC) by tobiassjosten
|
Message
| Tsunami,
1) It's just to test these routines, and to learn LUA. It'll change when can get this to work and move on to the next step. For now, I sit down when I get afflicted (a "p" is added to the prompt) and stand up when I want to cure it. ;)
2) I do that to avoid having triggers named "affClumsiness1", "affClumsiness2" etc. And to pass onto the trigger the toxin-parameter (to indicate this message came from a toxin, and therefor an attack-message must have been seen)
3) That'll change, just found it easiest to do it this way for testing. However, you might want to use a prompt-based tracker, to add better support for Lifevision (detects some illusions)
4) Good point, I'll probably change that. Did it this way to not only call the eatHerb function from other functions, but also aliases (like: eww, emh). But it could be worked around, for prettier code. ;)
5) Yeah, I got bHerb for the actualy balance and doHerb for when the system has sent out an eat command. If either bHerb is nil or doHerb isn't nil, I don't send out new commands.
Flannel,
No tweaking, no nothing. The only thing that differs from other plugins I've seen so far is that I keep my LUA-code in a seperate file which is requested.
And yes, just before MC crashed I see that it tries to send the "outr herb", "eat herb". Then I get the prompt, and "(DEBUG) Cannot eat!" is printed. That's all I have time to see before Windows shuts it down..
I'll heed you advice and try to reinstall it. But don't hesitate to gimme pointers on this code if you feel a need. ;) It's driving me insane, as I really think it should work, but for some wierd reason it doesn't.
Edit: Reinstalled it, but it didn't work. I checked out the error message I got from Windows this time though, and it complained about the LUA DLL. The whole error message wasn't saved, but I could recreate it in case you want to check it out Nick? |
Simplicity is Divine | http://nogfx.org/ | Top |
|
Posted by
| Nick Gammon
Australia (23,120 posts) Bio
Forum Administrator |
Date
| Reply #5 on Sat 30 Apr 2005 09:46 AM (UTC) |
Message
| Ok, I haven't tried to reproduce the crash, which I suspect is some sort of stack overflow in the script engine, however I am puzzled by this:
cureHerb ("maidenhair", "emh")
...
cureHerb ("kelp", "eke")
function cureHerb (name, line, wildcards)
if line == "eww" then doHerb = "wormwood"
elseif line == "emh" then doHerb = "maidenhair"
end
Now you only call cureHerb in 2 places, with 2 arguments, however you are accepting 3 arguments. Not that this is a huge problem, but it seems to indicate you aren't totally sure what you are passing from one function to another.
The second argument is either "emh" or "eke" but you are testing it to be "emh" or "eww", so it will fail both those tests.
The Lua script engine is supposed to be fairly lightweight and fast, so it possibly does not test for stack overflow (probably a difficult thing to to in a platform-independent way), and thus if the stack does overflow, you may well get a crash, and since the crash is in a DLL called by MUSHclient, then that will crash MUSHclient too. |
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| tobiassjosten
Sweden (79 posts) Bio
|
Date
| Reply #6 on Sat 30 Apr 2005 10:43 AM (UTC) |
Message
| It's just a somewhat stripped down version. In the full code I also have two aliases which is used for manual curing.
<aliases>
<alias
script="cureHerb"
match="^eww$"
enabled="y"
group="cxCuringAliases"
regexp="y"
keep_evaluating="y"
sequence="100"
>
</alias>
<alias
script="cureHerb"
match="^emh$"
enabled="y"
group="cxCuringAliases"
regexp="y"
keep_evaluating="y"
sequence="100"
>
</alias>
</aliases>
And the cureHerb function is bigger.
function cureHerb (name, line, wildcards)
if line == "eww" then doHerb = "wormwood"
elseif line == "emh" then doHerb = "maidenhair"
elseif line == "ens" then doHerb = "nightshade"
elseif line == "eke" then doHerb = "kelp"
elseif line == "ega" then doHerb = "galingale"
elseif line == "ema" then doHerb = "mandrake"
elseif line == "eor" then doHerb = "orphine"
elseif line == "ehs" then doHerb = "hyssop"
elseif line == "eju" then doHerb = "juniper"
end
Send ("outr " .. doHerb)
Send ("eat " .. doHerb)
end
The way it works is that when the system tries to cure something, it sends cureHerb() with appropriate parameters. cureHerb then sets doHerb to whatever it's eating and sends out the "outr herb" and "eat herb". When the prompt comes up again (comes right after the OUTR command is successful), it checks if it can eat by testing bHerb==1 and doHerb=="none". Since it cant eat when it just fired (doHerb is set to some herb), it prints "Cannot eat!", and then it should just end. But.. It crashes. |
Simplicity is Divine | http://nogfx.org/ | Top |
|
Posted by
| Nick Gammon
Australia (23,120 posts) Bio
Forum Administrator |
Date
| Reply #7 on Sun 01 May 2005 12:52 AM (UTC) |
Message
| OK, next comment. You can neaten up the cureHerb function by using a table, like this:
herbtable = {
eww = "wormwood",
emh = "maidenhair",
ens = "nightshade",
eke = "kelp",
ega = "galingale",
ema = "mandrake",
eor = "orphine",
ehs = "hyssop",
eju = "juniper",
}
function cureHerb (name, line, wildcards)
doHerb = herbtable [line]
if doHerb then
Send ("outr " .. doHerb)
Send ("eat " .. doHerb)
end -- if
end
This saves having a heap of ifs and, lets you store the herbs in a variable if you like (see my article about serializing Lua data into MUSHclient variables).
Now, you seem to be making a common mistake C programmers make when using Lua. Try this bit of code:
Possibly to your surprise, "hi" will be printed.
The fact is that only the boolean value "false" and the value "nil" are considered false. Everything else, including the number 0, are true.
Thus this code will always return a true result:
function canEat ()
if bHerb == 1 then
if doHerb == "none" then
if aff['anorexia'] ~= 2 then
return 1
end
end
end
return 0
end
I notice you are not actually testing for true or false, so you have used it correctly, but it looks clumsy.
If you change it to:
function canEat ()
if bHerb == 1 then
if doHerb == "none" then
if aff['anorexia'] ~= 2 then
return true
end
end
end
return false
end
Then you can simply say "if canEat () then ...".
Similarly you can replace:
if aff['paralysis'] ~= nil then
by ...
I still can't reproduce the crash however. Can you show us what debugNote does?
|
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Nick Gammon
Australia (23,120 posts) Bio
Forum Administrator |
Date
| Reply #8 on Sun 01 May 2005 12:55 AM (UTC) |
Message
| Try turning off "keep evaluating" for the cure prompt trigger. The fact that it displays "cannot eat" suggests that maybe that script actually finished, and another one is causing the problem. |
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| tobiassjosten
Sweden (79 posts) Bio
|
Date
| Reply #9 on Sun 01 May 2005 09:44 PM (UTC) |
Message
| Removed the keep_evaluating, same results.. Even removed everything but these triggers/scripts, uninstalled and reinstalled the client but it still crashes on me. |
Simplicity is Divine | http://nogfx.org/ | Top |
|
Posted by
| Flannel
USA (1,230 posts) Bio
|
Date
| Reply #10 on Sun 01 May 2005 09:57 PM (UTC) |
Message
| Post ALL (well, all of the ones in the stripped down version you just made that still crashed) the triggers exactly as they appear (and the script file) in your world file and the output from the server that causes the crash (and current state of variables). Since that'll be the only way we track this down.
This is probably going to be too much for one post, so you might want to zip and post a URL (if you have somewhere to host), if not just post it in pieces. |
~Flannel
Messiah of Rose
Eternity's Trials.
Clones are people two. | Top |
|
Posted by
| tobiassjosten
Sweden (79 posts) Bio
|
Date
| Reply #11 on Mon 02 May 2005 12:23 AM (UTC) |
Message
| Thanks alot for trying to help me out, thought you'd given up by now. ;)
Here's the URL: http://www.crox.org/mc_sys.rar
Contains -everything- I use for MUSHclient (3 files). Got some other ideas on how I could work around this, but first I want to know what's causing this.. |
Simplicity is Divine | http://nogfx.org/ | Top |
|
Posted by
| Nick Gammon
Australia (23,120 posts) Bio
Forum Administrator |
Date
| Reply #12 on Mon 02 May 2005 06:36 AM (UTC) Amended on Mon 02 May 2005 06:37 AM (UTC) by Nick Gammon
|
Message
| Can you please re-post using a more widely-used compression method, such as winzip? Thanks.
Or, don't compress, I presume the files aren't megabytes long. |
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Nick Gammon
Australia (23,120 posts) Bio
Forum Administrator |
Date
| Reply #13 on Mon 02 May 2005 06:38 AM (UTC) |
Message
| Also please post, if it isn't in those files, the exact text that comes from the MUD that causes the problem. |
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| tobiassjosten
Sweden (79 posts) Bio
|
Date
| Reply #14 on Mon 02 May 2005 10:34 AM (UTC) |
Message
| RAR -> http://www.crox.org/mc_sys.rar
ZIP -> http://www.crox.org/mc_sys.zip
Added a log of what happens when the system crashes. Also, I suspect that the crash isn't caused by the curePrompt function, as I tried to cure i manual (when sitting, and therefor keeping the curePromt from firing) and it still crashes. Perhaps the error is in the addDel function?
It's all in those archives, but I'll paste it here for faster access:
<trigger
enabled="y"
group="cxCuring"
keep_evaluating="y"
match="^You feel coordinated once more\.$"
regexp="y"
send_to="12"
sequence="100"
>
function affDel (name)
if curing ~= nil then
aff[name] = nil
debugNote ("Removed affliction: " .. name)
else
debugNote ("Illusion catched, no cured detected")
end
end
|
Simplicity is Divine | http://nogfx.org/ | Top |
|
The dates and times for posts above are shown in Universal Co-ordinated Time (UTC).
To show them in your local time you can join the forum, and then set the 'time correction' field in your profile to the number of hours difference between your location and UTC time.
70,408 views.
This is page 1, subject is 2 pages long: 1 2
It is now over 60 days since the last post. This thread is closed.
Refresh page
top