Compare commits

..

4 Commits

Author SHA1 Message Date
loosewheel
c30e5b6947 Add files via upload 2021-11-14 06:05:23 +10:00
loosewheel
92a065b591 Add files via upload 2021-11-14 06:04:46 +10:00
loosewheel
af812515bb Create api.txt 2021-11-14 06:00:58 +10:00
loosewheel
0d27b384a2 Add files via upload 2021-11-14 01:52:55 +10:00
9 changed files with 179 additions and 43 deletions

12
api.lua Normal file
View File

@@ -0,0 +1,12 @@
local utils = ...
-- function (spawn_pos, itemstack, owner, spawner_pos, spawner_dir)
function lwcomponents.register_spawner (itemname, spawn_func)
return utils.register_spawner (itemname, spawn_func)
end
--

View File

@@ -22,3 +22,12 @@ v0.1.3
* Added dispensers spawn if spawner with optional dependency on mobs mod.
If mobs:egg is dispensed 10% change a chicken is dispensed instead.
* Added player_button.
v0.1.4
* Bug fix to spawning owned mobs.
v0.1.5
* Added setting Spawn mobs.
* Added lwcomponents.register_spawner api.

View File

@@ -7,6 +7,22 @@ if utils.digilines_supported or utils.mesecon_supported then
local function dispense_dir (node)
if node.param2 == 0 then
return { x = 0, y = 0, z = -1 }
elseif node.param2 == 1 then
return { x = -1, y = 0, z = 0 }
elseif node.param2 == 2 then
return { x = 0, y = 0, z = 1 }
elseif node.param2 == 3 then
return { x = 1, y = 0, z = 0 }
else
return { x = 0, y = 0, z = 0 }
end
end
local function dispense_pos (pos, node)
if node.param2 == 0 then
return { x = pos.x, y = pos.y, z = pos.z - 1 }
@@ -64,15 +80,15 @@ end
local function try_spawn (pos, node, item)
if utils.mobs_supported then
local function try_spawn (pos, node, item, owner)
if utils.mobs_supported and utils.settings.spawn_mobs then
local mob = item:get_name ()
local item_def = minetest.registered_craftitems[mob]
local spawn_pos = dispense_pos (pos, node)
if item_def and item_def.groups and item_def.groups.spawn_egg then
if mob:sub (mob:len () - 4) == "_set" then
mob = mob:sub (1, mob:len () - 5)
if mob:sub (mob:len () - 3) == "_set" then
mob = mob:sub (1, mob:len () - 4)
if minetest.registered_entities[mob] then
local data = item:get_metadata ()
@@ -80,18 +96,12 @@ local function try_spawn (pos, node, item)
local ent = smob and smob:get_luaentity ()
if ent then
local meta = minetest.get_meta (pos)
if meta then
local owner = meta:get_string ("owner")
-- set owner if not a monster
if owner:len () > 0 and ent.type ~= "monster" then
ent.owner = owner
ent.tamed = true
end
end
end
return smob
end
@@ -102,18 +112,12 @@ local function try_spawn (pos, node, item)
local ent = smob and smob:get_luaentity ()
if ent then
local meta = minetest.get_meta (pos)
if meta then
local owner = meta:get_string ("owner")
-- set owner if not a monster
if owner:len () > 0 and ent.type ~= "monster" then
ent.owner = owner
ent.tamed = true
end
end
end
return smob
end
@@ -126,18 +130,12 @@ local function try_spawn (pos, node, item)
local ent = smob and smob:get_luaentity ()
if ent then
local meta = minetest.get_meta (pos)
if meta then
local owner = meta:get_string ("owner")
-- set owner if not a monster
if owner:len () > 0 and ent.type ~= "monster" then
ent.owner = owner
ent.tamed = true
end
end
end
return smob
end
@@ -148,6 +146,7 @@ local function try_spawn (pos, node, item)
end
-- slot:
-- nil - next item, no dispense if empty
-- number - 1 item from slot, no dispense if empty
@@ -202,11 +201,26 @@ local function dispense_item (pos, node, slot)
if item then
item:set_count (1)
local spawn_pos = dispense_pos (pos, node)
local owner = meta:get_string ("owner")
local obj = try_spawn (pos, node, item)
local obj, cancel = utils.spawn_registered (name,
spawn_pos,
item,
owner,
pos,
dispense_dir (node))
if obj == nil and cancel then
return false
end
if not obj then
obj = minetest.add_item (dispense_pos (pos, node), item)
obj = try_spawn (pos, node, item, owner)
end
if not obj then
obj = minetest.add_item (spawn_pos, item)
end
if obj then

47
docs/api.txt Normal file
View File

@@ -0,0 +1,47 @@
lwcomponents.version ()
Returns this mod version as a string. eg. "0.1.5".
lwcomponents.register_spawner (itemname, spawn_func)
itemname:
Registered string name of the spawner item
spawn_func:
The function to call to spawn the mob of the form -
spawn_func (spawn_pos, itemstack, owner, spawner_pos, spawner_dir)
spawn_pos:
The position the entity should be spawned at.
itemstack:
The spawner ItemStack, of the name itemname.
owner:
As string of the player's name that will own the spawned entity,
if applicable. This may be "" for no owner.
spawner_pos:
The position of the block calling this function.
spawner_dir:
A single unit vector of the direction the spawner block is facing.
eg. { x = -1, y = 0, z = 0 }
This function should return the ObjectRef of the spawned entity or
nil. If this function returns nil for ObjectRef a second boolean
value should be returned for weather to cancel the action.
eg. If too many mobs:
return nil, true
eg. If only chance of spawn and out of luck:
return nil, false
The register function return true on success, or false on failure
(parameter type check failed or the spawn item has already been
registered).

View File

@@ -1,4 +1,4 @@
local version = "0.1.3"
local version = "0.1.5"
local mod_storage = minetest.get_mod_storage ()
@@ -16,6 +16,8 @@ local utils = { }
local modpath = minetest.get_modpath ("lwcomponents")
loadfile (modpath.."/utils.lua") (utils, mod_storage)
loadfile (modpath.."/settings.lua") (utils)
loadfile (modpath.."/api.lua") (utils)
loadfile (modpath.."/dropper.lua") (utils)
loadfile (modpath.."/collector.lua") (utils)
loadfile (modpath.."/dispenser.lua") (utils)

View File

@@ -13,7 +13,7 @@ CC BY-SA 3.0
Version
=======
0.1.3
0.1.5
Minetest Version
@@ -103,11 +103,11 @@ Contains an inventory and dispenses (with velocity) an item on command.
Also acts as a digilines conductor. If the hopper mod is loaded, will take
items from the top and sides, and release them from the bottom.
Dispensers support mobs mod if loaded. Will spawn the entity from an 'egg'
if possible, or the 'egg' is dispensed. If a chicken egg is dispensed a
10% chance a chicken is dispensed instead. If the spawned entity can be
owned (or tamed) and the dispenser is owned the owner of the dispenser is
set as the owner of the entity.
Dispensers support mobs mod if loaded and Spawn mobs setting is enabled.
Will spawn the entity from an 'egg' if possible, or the 'egg' is dispensed.
If a chicken egg is dispensed a 10% chance a chicken is dispensed instead.
If the spawned entity can be owned (or tamed) and the dispenser is owned
the owner of the dispenser is set as the owner of the entity.
UI

11
settings.lua Normal file
View File

@@ -0,0 +1,11 @@
local utils = ...
utils.settings = { }
utils.settings.spawn_mobs =
minetest.settings:get_bool ("lwcomponents_spawn_mobs", true)
--

2
settingtypes.txt Normal file
View File

@@ -0,0 +1,2 @@
# Allow dispensers to spawn mobs instead of spawners.
lwcomponents_spawn_mobs (Spawn mobs) bool true

View File

@@ -171,4 +171,43 @@ end
utils.registered_spawners = { }
-- each entry [spawner_itemname] = spawner_func
function utils.register_spawner (itemname, spawn_func)
if type (itemname) == "string" and type (spawn_func) == "function" then
if not utils.registered_spawners[itemname] then
utils.registered_spawners[itemname] = spawn_func
return true
end
end
return false
end
function utils.spawn_registered (itemname, spawn_pos, itemstack, owner, spawner_pos, spawner_dir)
local func = utils.registered_spawners[itemname]
if func then
local result, obj, cancel = pcall (func, spawn_pos, itemstack, owner, spawner_pos, spawner_dir)
if result and (obj == nil or type (obj) == "userdata") then
return obj, cancel
end
minetest.log ("error", "lwcomponents.register_spawner spawner function for "..itemname.." failed")
return nil, true
end
return nil, false
end
--