Go to file
2025-03-29 16:23:16 +03:00
dump.lua be more consistent and less confusing with dumped object names 2025-03-29 16:23:16 +03:00
init.lua add players magic variable 2025-03-27 21:51:44 +03:00
LICENSE add dead bytes 2025-03-19 10:28:32 +03:00
README.md add boring "help" variable 2025-03-25 14:14:39 +03:00
todo.org some quality of life features for using global vars 2025-03-20 12:43:45 +03:00
util.lua add pointing to objects and nodes 2024-12-08 20:41:45 +03:00

Adds /eval command

/eval takes lua code as argument and executes it. It will echo your command and show it's output and returned value. Each player gets their own "global" environment so they can't interfere with other user's envs by accident (exposed as cmd_eval.e[player_name]).

Some nice features:

Expression/statement agnostic

This command:

/eval 1+2

Outputs this:

> 1+2
| 3

This also just works:

> x = 2*2

> x
| 4

Multiple values also work:

> return 1,nil,3
| 1,
| nil,
| 3

Backtrace and error output

Outputs both the error and clean backtrace (stack related only to provided code)

Print function

No need to use core.chat_send_player(), just use print() - it will do the right thing.

> print(here)
< (-98.0, 15.5, 33.4)
> objs = core.get_objects_inside_radius(here, 10)

> for i,o in ipairs(objs) do print(i, (o:get_luaentity() or {}).name, o:get_pos()) end
< 1 nil (-98.0, 15.5, 33.4)
< 2 mobs_animal:kitten (-101.0, 16.5, 30.0)
< 3 mobs_animal:chicken (-92.0, 15.5, 34.2)

"Magic" variables

Some special variables are provided:

  • here - position where you executed the command
  • me - your player object
  • point - point in the world you're pointing at with your crosshair
  • this_obj - entity you're pointing at (can be nil)

Do /eval help to get a quick reminder of these vars and functions.

Better output for arrays and some userdata objects

> me
| #<player: "singleplayer">

Show indices for easier manual access:

> core.get_objects_inside_radius(here, 10)
| {
|  [1] = #<player: "singleplayer">,
|  [2] = #<luaentity: "mobs_animal:kitten">,
|  [3] = #<luaentity: "mobs_animal:chicken">,
| }

Keeping result of last /eval in _ variable

> core.get_objects_inside_radius(here, 10)
| {
|  [1] = #<player: "singleplayer">,
|  [2] = #<luaentity: "mobs_animal:kitten">,
| }

> _[2]
| #<luaentity: "mobs_animal:kitten">

> pos = _:get_pos()

> pos
| {
|  x = 123.5,
|  y = 15.0,
|  z = 68.4
| }

Accessing and changing global variables

You can save some keypresses by not typing local in front of every variable. Assigning to globals won't clobber them, instead using your personal environment. But you can still read globals as usual.

> print(myvar)
* Accessing undeclared variable: "myvar"
< nil

> myvar = 1
| Done.

> print(myvar)
< 1
| Done.

If you want to create a new global or actually overwrite existing one, you can access global environment through usual _G or global variables. Using them will print a message telling you if global var already existed.

> cmd_eval = nil
| Done.

> cmd_eval  -- accesses real global
{
  e = { ... }, ...
}

> global.cmd_eval = nil
* Overwriting global: "cmd_eval"
| Done.

> cmd_eval
| nil       -- wiped for real

Other shortcuts

dir() and keys()

List keys of the table (useful for exploring data structures, without flooding your chat).

get_objects_inside_radius() shortcuts: goir() and oir()

goir(radius) returns a list of objects around you oir(radius) returns an iterator of objects around you

> goir(100)   -- return a list of objects within 100 units around you

> for v in oir(100) do print((v:get_luaentity() or {}).name) end