refactor add nssm as demo

master
Tai @ Flex 2016-09-29 21:03:42 +01:00
parent 7ddb195686
commit f19b188f7b
5 changed files with 176 additions and 122 deletions

37
command.lua Normal file
View File

@ -0,0 +1,37 @@
local chat_spawn_mob = function(playername,paramstring) -- used by chat command and by global step
local piterator = string.gmatch(paramstring,"%S+")
-- get player name
local victim = piterator()
-- get mob name
local mobname = piterator()
if mobname == nil or victim == nil then
minetest.chat_send_player(playername,"Usage: /spawnto <PLAYER> <MOB NAME>")
return
end
if not minetest.registered_entities[mobname] then
if not spawnstep.mobnodes[mobname] then
minetest.chat_send_player(playername,"No such mob "..mobname)
return
end
mobname = spawnstep.mobnodes[mobname].mob
if not minetest.registered_entities[mobname] then
minetest.chat_send_player(playername,"No such mob "..mobname.." - contact the admin.")
return
end
end
-- get player position
local pos = vector.round(minetest.get_player_by_name(victim):getpos())
-- add entity near player's position
spawnstep.spawn_mob(pos,mobname)
end
minetest.register_chatcommand("spawnto",{
privs = "spawner",
params = "<PLAYER> <MOBSTRING>",
func = chat_spawn_mob
})

106
init.lua
View File

@ -2,24 +2,10 @@
spawnstep = {}
dofile(minetest.get_modpath("spawnstep").."/settings.lua")
dofile(minetest.get_modpath("spawnstep").."/spawndefs.lua")
minetest.register_privilege("spawner","Allow player to spawn mobs")
minetest.register_privilege("digspawntrap","Allow player to dig spawn traps")
minetest.register_node("spawnstep:spawntrap",{
description = "Spawn a mob depending on the block beneath it",
tiles = spawnstep.tiles,
drawtype = "normal",
groups = {crumbly = 1},
on_dig = function(pos,node,player)
if minetest.check_player_privs(player:get_player_name(), {digspawntrap=true}) then
minetest.remove_node(pos)
end
end
})
local spawn_mob = function(pos,mobname)
spawnstep.spawn_mob = function(pos,mobname)
-- spawn a mob within spawnrange nodes of position pos
local mobdef = minetest.registered_entities[mobname]
if mobdef == nil then return end
@ -38,89 +24,5 @@ local spawn_mob = function(pos,mobname)
minetest.add_entity(newpos,mobname)
end
local count_nearby_mobs = function(pos,radius)
-- check if there are entities around already
local objcount = 0
for _,obj in pairs(minetest.get_objects_inside_radius(pos ,radius)) do
if not obj:is_player() then
objcount = objcount+1
end
end
return objcount
end
local get_mob_from_node = function(pos)
-- return the expected mob, or nil if none matches
-- get node under position
local underpos = {x=pos.x, y=pos.y-1, z=pos.z}
local tellernode = minetest.get_node(underpos).name
-- iterate spawnstep.mobnodes, check against nodename
for _,mobnode in pairs(spawnstep.mobnodes) do
-- if match, return mobstring
if mobnode.node == tellernode then return mobnode.mob end
end
return nil
end
local chat_spawn_mob = function(playername,paramstring) -- used by chat command and by global step
local piterator = string.gmatch(paramstring,"%S+")
-- get player name
local victim = piterator()
-- get mob name
local mobname = piterator()
if mobname == nil or victim == nil then
minetest.chat_send_player(playername,"Usage: /spawnto <PLAYER> <MOB NAME>")
return
end
if not minetest.registered_entities[mobname] then
if not spawnstep.mobnodes[mobname] then
minetest.chat_send_player(playername,"No such mob "..mobname)
return
end
mobname = spawnstep.mobnodes[mobname].mob
if not minetest.registered_entities[mobname] then
minetest.chat_send_player(playername,"No such mob "..mobname.." - contact the admin.")
return
end
end
-- get player position
local pos = vector.round(minetest.get_player_by_name(victim):getpos())
-- add entity near player's position
spawn_mob(pos,mobname)
end
minetest.register_chatcommand("spawnto",{
privs = "spawner",
params = "<PLAYER> <MOBSTRING>",
func = chat_spawn_mob
})
minetest.register_abm{
nodenames = {"spawnstep:spawntrap"},
neighbors = nil,
interval = spawnstep.interval,
chance = 1,
action = function(pos)
for _,obj in pairs(minetest.get_objects_inside_radius(pos ,spawnstep.proximity)) do
if obj:is_player() then
minetest.debug("Player "..obj:get_player_name().." triggered spawn trap")
if count_nearby_mobs(pos,math.ceil(spawnstep.spawnrange*1.4)) < spawnstep.maxmobs then
local mobname = get_mob_from_node(pos)
if mobname ~= nil then
local mobnicename = mobname:sub(mobname:find(':')+1,#mobname )
minetest.chat_send_player(obj:get_player_name(),"A wild "..mobnicename.." appeared!")
spawn_mob(pos,mobname)
else
minetest.debug("Failed to determine a mob.")
end
else
minetest.debug("Too many mobs. Not spawning.")
end
end
end
end,
}
dofile(minetest.get_modpath("spawnstep").."/trap.lua")
dofile(minetest.get_modpath("spawnstep").."/command.lua")

15
settings.lua Normal file
View File

@ -0,0 +1,15 @@
-- Settings for the spawn trap
spawnstep.proximity = 3 -- radius range of player detection, around trap node
spawnstep.spawnrange = 4 -- radius range of where the mob will spawn
spawnstep.interval = 1 -- how frequently to try to spawn a new mob (seconds)
spawnstep.maxmobs = 1 -- maxiumum number of mobs to allow in area defined by spawn range, around the trap node
spawnstep.tiles = { -- define the tiles for the trap node
"default_stone.png^default_mese_crystal.png"
}
minetest.register_privilege("spawner","Allow player to spawn mobs")
minetest.register_privilege("digspawntrap","Allow player to dig spawn traps")

View File

@ -1,33 +1,60 @@
spawnstep.proximity = 1 -- radius range of player detection, around trap node
spawnstep.spawnrange = 7 -- radius range of where the mob will spawn
spawnstep.interval = 1 -- how frequently to try to spawn a new mob (seconds)
spawnstep.maxmobs = 4 -- maxiumum number of mobs to allow in area defined by spawn range, around the trap node
spawnstep.tiles = { -- define the tiles for the trap node
"default_stone.png^default_mese_crystal.png"
}
-- ++++++++++++++++++++
spawnstep.mobnodes = {
dirtmonster = {
senderman = {
node="nyancat:nyancat",
mob="mobs_senderman:senderman",
},
giantsandworm = {
node="default:sandstonebrick",
mob="nssm:giant_sandworm",
},
echidna = {
node="default:mossycobble",
mob="nssm:echidna",
},
phoenix = {
node="fire:permanent_flame",
mob="nssm:phoenix",
},
duckking = {
node="default:dirt",
mob="mobs_monster:dirt_monster",
mob="nssm:duckking",
},
stonemonster = {
node="default:stone",
mob="mobs_monster:stone_monster",
lavatitan = {
node="default:lava_source",
mob="nssm:lava_titan",
},
dungeonmaster = {
node="default:obsidian",
mob="mobs_monster:dungeon_master"
antqueen = {
node="nssm:antdirt",
mob="nssm:antqueen"
},
bossdm = {
node="default:nyancat",
mob="mobs_monster:dungeon_master_boss"
tarantula = {
node="nssm:web",
mob="nssm:tarantula",
},
kraken = {
node="default:water_source",
mob="nssm:kraken",
},
icelamander = {
node="default:snow",
mob="nssm:icelamander",
},
pumpking = {
node="default:pine_tree",
mob="nssm:pumpking",
},
nightmaster = {
node="default:torch",
mob="nssm:night_master",
},
nyan = {
node="nyancat:nyancat_rainbow",
mob="dmobs:nyan",
}
}

73
trap.lua Normal file
View File

@ -0,0 +1,73 @@
-- The trap node
minetest.register_node("spawnstep:spawntrap",{
description = "Spawn a mob depending on the block beneath it",
tiles = spawnstep.tiles,
drawtype = "normal",
groups = {crumbly = 1},
on_dig = function(pos,node,player)
if minetest.check_player_privs(player:get_player_name(), {digspawntrap=true}) then
minetest.remove_node(pos)
end
end
})
core.register_craft({
output="spawnstep:spawntrap",
recipe={
{"","default:mese",""},
{"","default:obsidian",""},
{"default:diamondblock","default:obsidian","default:diamondblock"},
}
})
local count_nearby_mobs = function(pos,radius)
-- check if there are entities around already
local objcount = 0
for _,obj in pairs(minetest.get_objects_inside_radius(pos ,radius)) do
if not obj:is_player() then
objcount = objcount+1
end
end
return objcount
end
local get_mob_from_node = function(pos)
-- return the expected mob, or nil if none matches
-- get node under position
local underpos = {x=pos.x, y=pos.y-1, z=pos.z}
local tellernode = minetest.get_node(underpos).name
-- iterate spawnstep.mobnodes, check against nodename
for _,mobnode in pairs(spawnstep.mobnodes) do
-- if match, return mobstring
if mobnode.node == tellernode then return mobnode.mob end
end
return nil
end
minetest.register_abm{
nodenames = {"spawnstep:spawntrap"},
neighbors = nil,
interval = spawnstep.interval,
chance = 1,
action = function(pos)
for _,obj in pairs(minetest.get_objects_inside_radius(pos ,spawnstep.proximity)) do
if obj:is_player() then
minetest.debug("Player "..obj:get_player_name().." triggered spawn trap")
if count_nearby_mobs(pos,math.ceil(spawnstep.spawnrange*1.4)) < spawnstep.maxmobs then
local mobname = get_mob_from_node(pos)
if mobname ~= nil then
local mobnicename = mobname:sub(mobname:find(':')+1,#mobname )
minetest.chat_send_player(obj:get_player_name(),"A wild "..mobnicename.." appeared!")
spawnstep.spawn_mob(pos,mobname)
else
minetest.debug("Failed to determine a mob.")
end
else
minetest.debug("Too many mobs. Not spawning.")
end
end
end
end,
}