aboutsummaryrefslogtreecommitdiff
path: root/src/script/lua_api/l_particles.cpp
blob: 088eba06e7a6d53d0140754047d4939d578a10fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
--chatcmds.lua
--Registers commands to modify the init and step code for LuaAutomation

--position helper.
--punching a node will result in that position being saved and inserted into a text field on the top of init form.
local punchpos={}

minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
	local pname=player:get_player_name()
	punchpos[pname]=pos
end)

local function get_init_form(env, pname)
	local err = env.init_err or ""
	local code = env.init_code or ""
	local ppos=punchpos[pname]
	local pp=""
	if ppos then
		pp="POS"..minetest.pos_to_string(ppos)
	end
	local form = "size[10,10]button[0,0;2,1;run;Run InitCode]button[2,0;2,1;cls;Clear S]"
		.."button[4,0;2,1;save;Save] button[6,0;2,1;del;Delete Env.] field[8.1,0.5;2,1;punchpos;Last punched position;"..pp.."]"
		.."textarea[0.2,1;10,10;code;Environment initialization code;"..minetest.formspec_escape(code).."]"
		.."label[0,9.8;"..err.."]"
	return form
end

core.register_chatcommand("env_setup", {
	params = "<environment name>",
	description = "Set up and modify AdvTrains LuaAutomation environment",
	privs = {atlatc=true},
	func = function(name, param)
		local env=atlatc.envs[param]
		if not env then return false,"Invalid environment name!" end
		minetest.show_formspec(name, "atlatc_envsetup_"..param, get_init_form(env, name))
		return true
	end,
})

core.register_chatcommand("env_create", {
	params = "<environment name>",
	description = "Create an AdvTrains LuaAutomation environment",
	privs = {atlatc=true},
	func = function(name, param)
		if not param or param=="" then return false, "Name required!" end
		if atlatc.envs[param] then return false, "Environment already exists!" end
		atlatc.envs[param] = atlatc.env_new(param)
		return true, "Created environment '"..param.."'. Use '/env_setup "..param.."' to define global initialization code, or start building LuaATC components!"
	end,
})


minetest.register_on_player_receive_fields(function(player, formname, fields)
	
	local pname=player:get_player_name()
	if not minetest.check_player_privs(pname, {atlatc=true}) then return end
	
	local envname=string.match(formname, "^atlatc_delconfirm_(.+)$")
	if envname and fields.sure=="YES" then
		atlatc.envs[envname]=nil
		minetest.chat_send_player(pname, "Environment deleted!")
		return
	end
	
	envname=string.match(formname, "^atlatc_envsetup_(.+)$")
	if not envname then return end
	
	local env=atlatc.envs[envname]
	if not env then return end
	
	if fields.del then
		minetest.show_formspec(pname, "atlatc_delconfirm_"..envname, "field[sure;"..minetest.formspec_escape("SURE TO DELETE ENVIRONMENT "..envname.."? Type YES (all uppercase) to continue or just quit form to cancel.")..";]")
		return
	end
	
	env.init_err=nil
	if fields.code then
		env.init_code=fields.code
	end
	if fields.run then
		env:run_initcode()
		minetest.show_formspec(pname, formname, get_init_form(env, pname))
	end
end)
/span>(L); while (lua_next(L, table) != 0) { const char *key = lua_tostring(L, -2); if(strcmp(key,"pos")==0){ pos=check_v3f(L, -1); }else if(strcmp(key,"vel")==0){ vel=check_v3f(L, -1); }else if(strcmp(key,"acc")==0){ acc=check_v3f(L, -1); }else if(strcmp(key,"expirationtime")==0){ expirationtime=luaL_checknumber(L, -1); }else if(strcmp(key,"size")==0){ size=luaL_checknumber(L, -1); }else if(strcmp(key,"collisiondetection")==0){ collisiondetection=lua_toboolean(L, -1); }else if(strcmp(key,"vertical")==0){ vertical=lua_toboolean(L, -1); }else if(strcmp(key,"texture")==0){ texture=luaL_checkstring(L, -1); }else if(strcmp(key,"playername")==0){ playername=luaL_checkstring(L, -1); } lua_pop(L, 1); } } if (strcmp(playername, "")==0) // spawn for all players { getServer(L)->spawnParticleAll(pos, vel, acc, expirationtime, size, collisiondetection, vertical, texture); } else { getServer(L)->spawnParticle(playername, pos, vel, acc, expirationtime, size, collisiondetection, vertical, texture); } return 1; } // add_particlespawner({amount=, time=, // minpos=, maxpos=, // minvel=, maxvel=, // minacc=, maxacc=, // minexptime=, maxexptime=, // minsize=, maxsize=, // collisiondetection=, // vertical=, // texture=, // player=}) // minpos/maxpos/minvel/maxvel/minacc/maxacc = {x=num, y=num, z=num} // minexptime/maxexptime = num (seconds) // minsize/maxsize = num // collisiondetection = bool // vertical = bool // texture = e.g."default_wood.png" int ModApiParticles::l_add_particlespawner(lua_State *L) { // Get parameters u16 amount = 1; v3f minpos, maxpos, minvel, maxvel, minacc, maxacc; minpos= maxpos= minvel= maxvel= minacc= maxacc= v3f(0, 0, 0); float time, minexptime, maxexptime, minsize, maxsize; time= minexptime= maxexptime= minsize= maxsize= 1; bool collisiondetection, vertical; collisiondetection= vertical= false; std::string texture = ""; const char *playername = ""; if (lua_gettop(L) > 1) //deprecated { amount = luaL_checknumber(L, 1); time = luaL_checknumber(L, 2); minpos = check_v3f(L, 3); maxpos = check_v3f(L, 4); minvel = check_v3f(L, 5); maxvel = check_v3f(L, 6); minacc = check_v3f(L, 7); maxacc = check_v3f(L, 8); minexptime = luaL_checknumber(L, 9); maxexptime = luaL_checknumber(L, 10); minsize = luaL_checknumber(L, 11); maxsize = luaL_checknumber(L, 12); collisiondetection = lua_toboolean(L, 13); texture = luaL_checkstring(L, 14); if (lua_gettop(L) == 15) // only spawn for a single player playername = luaL_checkstring(L, 15); } else if (lua_istable(L, 1)) { int table = lua_gettop(L); lua_pushnil(L); while (lua_next(L, table) != 0) { const char *key = lua_tostring(L, -2); if(strcmp(key,"amount")==0){ amount=luaL_checknumber(L, -1); }else if(strcmp(key,"time")==0){ time=luaL_checknumber(L, -1); }else if(strcmp(key,"minpos")==0){ minpos=check_v3f(L, -1); }else if(strcmp(key,"maxpos")==0){ maxpos=check_v3f(L, -1); }else if(strcmp(key,"minvel")==0){ minvel=check_v3f(L, -1); }else if(strcmp(key,"maxvel")==0){ maxvel=check_v3f(L, -1); }else if(strcmp(key,"minacc")==0){ minacc=check_v3f(L, -1); }else if(strcmp(key,"maxacc")==0){ maxacc=check_v3f(L, -1); }else if(strcmp(key,"minexptime")==0){ minexptime=luaL_checknumber(L, -1); }else if(strcmp(key,"maxexptime")==0){ maxexptime=luaL_checknumber(L, -1); }else if(strcmp(key,"minsize")==0){ minsize=luaL_checknumber(L, -1); }else if(strcmp(key,"maxsize")==0){ maxsize=luaL_checknumber(L, -1); }else if(strcmp(key,"collisiondetection")==0){ collisiondetection=lua_toboolean(L, -1); }else if(strcmp(key,"vertical")==0){ vertical=lua_toboolean(L, -1); }else if(strcmp(key,"texture")==0){ texture=luaL_checkstring(L, -1); }else if(strcmp(key,"playername")==0){ playername=luaL_checkstring(L, -1); } lua_pop(L, 1); } } if (strcmp(playername, "")==0) //spawn for all players { u32 id = getServer(L)->addParticleSpawnerAll( amount, time, minpos, maxpos, minvel, maxvel, minacc, maxacc, minexptime, maxexptime, minsize, maxsize, collisiondetection, vertical, texture); lua_pushnumber(L, id); } else { u32 id = getServer(L)->addParticleSpawner(playername, amount, time, minpos, maxpos, minvel, maxvel, minacc, maxacc, minexptime, maxexptime, minsize, maxsize, collisiondetection, vertical, texture); lua_pushnumber(L, id); } return 1; } // delete_particlespawner(id, player) // player (string) is optional int ModApiParticles::l_delete_particlespawner(lua_State *L) { // Get parameters u32 id = luaL_checknumber(L, 1); if (lua_gettop(L) == 2) // only delete for one player { const char *playername = luaL_checkstring(L, 2); getServer(L)->deleteParticleSpawner(playername, id); } else // delete for all players { getServer(L)->deleteParticleSpawnerAll(id); } return 1; } void ModApiParticles::Initialize(lua_State *L, int top) { API_FCT(add_particle); API_FCT(add_particlespawner); API_FCT(delete_particlespawner); }