refactor add nssm as demo
parent
7ddb195686
commit
f19b188f7b
|
@ -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
106
init.lua
|
@ -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")
|
||||
|
|
|
@ -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")
|
|
@ -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",
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
}
|
Loading…
Reference in New Issue