Mods/basic robot csm: Difference between revisions
>Voxel No edit summary |
>Voxel No edit summary |
Latest revision as of 21:25, 17 April 2021
| basic_robot_csm | |
|---|---|
| A mod | |
| Mod Type | Robots |
| Author | rnd |
| Latest version | 2017-08-19 |
| Forum topic | Forum |
| Source code | GitHub |
| ContentDB | N/A |
| Technical name | basic_robot_csm |
This is the user-documentation about the mod basic_robot_csm by rnd - Forum github,
a lua-sandbox / chat-bot / calculator.
Intro
basic_robot_csm is a lightweight robot mod running on the minetest-client.
Users can write programs for this bot in Lua.
For safety, these programs are executed inside a sandbox that only allows certain lua-commands.
Input & Output happens mainly via chat, but it is also possible to play sounds,
and to process formspecs.
There is no robot-entity that moves independent of the player like in the mod basic_robot.
How to get
- install a minetest-version 0.4.16dev, 0.5.0 or later
- download mod from github
- unpack in "minetest DIR"/clientmods/
- enable client mods in advanced settings menu or in minetest.conf
- inside /clientmods/mods.conf there should be a line:
- load_mod_basic_robot_csm = true
- while playing say ".bot"
How to use
The chat-command '.bot' will present an editor-form with tabs and some buttons:
- Tabs 1-8 for source-code.
- Button "Start" starts executing the code of the program in the current tab.
- Button "Stop" stops the program.
- Button "Help" shows some helptext.
- Button "Save" saves the program of the current tab (using mod-storage).
Select a tab, enter a program (or use cut&paste)
- e.g. say("Hi")
press SAVE-button, press START-button.
The first line of text is used as the tab-title.
Commands
See commands in init.lua, function getSandboxEnv().
See also
Lua-docs:
misc
- robot_version
- say
- colorize
- tonumber
- pairs
- ipairs
- error
- type
- rom
- minetest
- see Lua Modding API Reference, 'Helper functions' and below
self
- self.name
- self.pos
- self.viewdir
- self.listen_msg
- self.sent_msg
- self.read_form
- self.sound
- self.sound_stop
- self.remove
code
- code.set
- code.run
os
- os.date
- os.clock
- os.time
- os.difftime
table
- table.maxn
- table.concat
- table.insert
- table.remove
- table.sort
string
- string.byte
- string.char
- string.len
- string.find
- string.gmatch
- string.format
- string.lower
- string.upper
- string.rep
- string.reverse
- string.sub
- string.gsub
math
- math.abs
- math.min
- math.max
- math.ceil
- math.floor
- math.huge
- math.modf
- math.fmod
- math.random
- math.exp
- math.frexp
- math.ldexp
- math.log
- math.log10
- math.pow
- math.sqrt
- math.pi
- math.deg
- math.rad
- math.acos
- math.cos
- math.cosh
- math.asin
- math.sin
- math.sinh
- math.tan
- math.tanh
- math.atan
- math.atan2
...
Example programs
When a program is started,
it is executed repeatedly (about once per second)
until stopped.
To stop it, press the STOP-button,
or use the command
- self.remove()
in the program.
HelloWorld
--HW
say("Hi")
self.remove()
Execute command
The second parameter for say() specifies that the text goes 'to server'.
--Cmd
say("/time",true)
say("/who",true)
self.remove()
Report time
--TimeDate
td = os.date("%Y-%m-%d %H:%M:%S")
say( "Time&Date: "..td )
-- this will repeat
Report position
Show the position of the player:
--Pos.
p = self.pos() -- returns a table, with elements x, y, and z
say("Position: x=" .. p.x .. ", y=" .. p.y .. ", z=" .. p.z)
-- this will repeat
Play sound
This can only play soundfiles that are already on the server.
--Sound
self.sound("default_break_glass")
self.remove()
Screenshot
-- sc minetest.take_screenshot() self.remove()
MiniMap
Switch the minimap on / off:
--mm
local mmm=minetest.ui.minimap:get_mode()
say('minimap-mode='..mmm) -- 0:off, 1..6
if mmm==0 then
minetest.ui.minimap:show()
else
minetest.ui.minimap:hide()
end
self.remove()
FormSpec
-- todo
Calculations
--Calc
if not i then i=1 end
x=17/i
say(i.." --> "..x)
i=i+1
if i>20 then say("Stop."); self.remove() end
Math
--Math
if not i then
i=0
say("pi="..math.pi)
end
i=i+1
x=math.random(1,6)
say(x)
if i>=5 then say("Stop."); self.remove() end
-- Todo: statistics
Chat-listener
Check the chat-messages for keywords, and answer with a message.
--Chat
msg = self.listen_msg();
if msg then
p=string.find(msg,"help")
if p then say("What is the problem ?") end
--
p=string.find(msg,"wiki")
www="http://wiki.minetest.net/ROBOTS_SKYBLOCK"
if p then say("see the wiki at "..www) end
--
end
- Note: this is an example, not ready for regular use, because it will find
- those keywords in a lot of places, where triggering is unintended.
Chat-bell
Plays a sound when your name appears in the text on chat.
--chatbell
if not myname then
myname="hajo"
bell ="default_break_glass" -- can only play soundfiles from the server
end
msg = self.listen_msg();
if msg then
p1=string.find(msg,">")
if p1 then
p2=string.find(msg,myname) or 0
if p2>p1 then -- don't trigger on your own chat
self.sound(bell)
end
end
end
Chat-bell2
Plays a sound when your name appears in the text on chat, but ignore some players.
--todo
--chatbell2
if not bell then
bell1 = "note_a" -- can only play soundfiles from the server
bell2 = "fire_flint_and_steel"
bell3 = "default_break_glass"
myname= self.name()
ignorelist="x y z"
end
msg = self.listen_msg();
if msg then
p=string.find(msg,">")
if p then
who=string.sub(msg,2,p-1)
msg=string.sub(msg,p+1)
bell=""
p=string.find(msg,myname) or 0
p=string.find(ignorelist,who) or 0
say(who..">"..p)
--todo...
end
end
Quiz-Solver
At the tutorial on the server ROBOTS_SKYBLOCK,
the robot #18 runs a math-quiz,
asking questions like "WHAT IS 12*13", via chat.
The following program watches for these questions,
calculates the result, and answers via chat.
-- Quiz-solver - 2017-09-03
-- for tutorial-robot #18
if not q then q=0 end
msg = self.listen_msg();
if msg then
p=string.find(msg,"WHAT IS")
if p then -- get the numbers of the math-question:
q1=string.sub(msg,p+8,p+9)
q2=string.sub(msg,p+11,p+12)
--say(p..">"..q1..">>"..q2)
n1=tonumber(q1)
n2=tonumber(q2)
say( n1*n2, true )
q=q+1
if q>10 then say("Stop."); self.remove() end
end
end
Questions/Ideas/Suggestions
- move SAVE-button to top
- strip "--" from tab-text
- ".bot 1" .. ".bot 8" run code from corresponding source-tab
- ".bot 0" - stop program
- ".bot -1" - pause/unpause program
- ".bot anyText" - use as input to current running program
- command / special tab for autostart-program
- eg. to do settings / commands when joining a server
- if mod-storage is empty, create short demo-program in first tab
- say(text,target) - extend target-spec (from only 'toserver' now) to 'owner' and 'userX'
- eg. to show debug-messages only to owner, or send PM to a certain user
- how to catch chat-messages starting with "***" ?
- write text to file, eg. chatlog ?
- set player-attributes, e.g. skin
- error when soundfile not found


