minetest.register_chatcommand("spawn", {
- params = "<mobname>",
- description = "Spawn a mob",
- privs = {give = true},
+ params = "<mob>",
+ description = "Spawn x amount of a mob, used as /spawn 'mob' 10 or /spawn 'mob' for one",
+ privs = {server = true},
func = function( name, mob)
- local input = mob
+ --local vars
+ local str = mob
local amount = 1
- local number_of_mobs = input.find(input, "%s%d+")
+
+ --checks if a player put a number of mobs
+ local number_of_mobs = string.find(str, "%s%d+")
+
+
+ --remove spaces from the string
if number_of_mobs == nil then
- input:gsub("%s", "")
- input = "mob:"..input
+ str:gsub("%s", "")
+ str = "mob:"..mob
+ --don't change amount
+ else--or find values
+ amount = tonumber(str:match("^.-%s(.*)"))
+ str = "mob:"..str:match("(.*)%s")
end
- if minetest.registered_entities[input] ~= nil then
- local pos = minetest.get_player_by_name(name):getpos()
+ --explain formatting
+ if amount == nil or str == nil then
+ minetest.chat_send_player(name, "Format as /spawn 'mob' 20 ... or /spawn 'mob'")
+ end
+
+ --add amount of entities if registered
+ if minetest.registered_entities[str] ~= nil then
+ local player = minetest.get_player_by_name(name)
+ local pos = player:get_pos()
pos.y = pos.y + 1.625
- minetest.add_entity(pos,input)
+ local pos2 = vector.add(pos,vector.multiply(player:get_look_dir(),80))
+ local ray = minetest.raycast(pos,pos2,false,false)
+ local casted_pos = table.copy(pos)
+ if ray then
+ local intersection = ray:next()
+ if intersection and intersection.above then
+ casted_pos = intersection.above
+ end
+ end
+
+
+ --add in amount through loop
+ if amount > 1 then
+ for i = 1,amount do
+ minetest.add_entity(casted_pos,str)
+ end
+ else --add single
+ minetest.add_entity(casted_pos,str)
+ end
+ else --tell player the mob doesn't exist if not a registered entity
+ minetest.chat_send_player(name, str:match("^.-:(.*)"):gsub("^%l", string.upper).." is not a mob.")
end
+
end,
-})
+})
\ No newline at end of file