2022-01-15 20:14:31 -05:00
|
|
|
-- LUALOCALS < ---------------------------------------------------------
|
2022-01-22 22:48:57 -05:00
|
|
|
local math, minetest, nodecore, pairs, vector
|
|
|
|
= math, minetest, nodecore, pairs, vector
|
2023-05-19 20:11:15 -04:00
|
|
|
local math_abs, math_floor, math_random
|
|
|
|
= math.abs, math.floor, math.random
|
2022-01-15 20:14:31 -05:00
|
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
|
|
|
|
local modname = minetest.get_current_modname()
|
2022-01-23 17:46:46 -05:00
|
|
|
local myapi = _G[modname]
|
2022-01-15 20:14:31 -05:00
|
|
|
|
2022-01-22 22:48:57 -05:00
|
|
|
local furmetakey = "catprill"
|
2022-01-16 15:39:03 -05:00
|
|
|
|
2022-01-22 22:48:57 -05:00
|
|
|
nodecore.register_soaking_abm({
|
|
|
|
label = "cat furball",
|
|
|
|
fieldname = "furball",
|
2022-01-16 15:39:03 -05:00
|
|
|
nodenames = {"group:" .. modname .. "_cat"},
|
|
|
|
interval = 5,
|
2022-01-22 22:48:57 -05:00
|
|
|
arealoaded = 3,
|
|
|
|
soakrate = function(pos)
|
|
|
|
local meta = minetest.get_meta(pos)
|
2022-01-26 20:50:36 -05:00
|
|
|
if (meta:get_float(furmetakey) or 0) ~= 0 then return false end
|
2022-01-22 22:48:57 -05:00
|
|
|
|
2022-01-16 15:39:03 -05:00
|
|
|
local found = #nodecore.find_nodes_around(pos,
|
2022-10-04 19:03:05 -04:00
|
|
|
"group:" .. modname .. "_face", 3)
|
2022-01-22 22:48:57 -05:00
|
|
|
return 2 ^ -math_abs(2 - found)
|
|
|
|
end,
|
|
|
|
soakcheck = function(data, pos)
|
2022-01-23 18:10:11 -05:00
|
|
|
if data.total < 1000 then return end
|
2022-01-22 22:48:57 -05:00
|
|
|
nodecore.log("action", "cat prill ready at " .. minetest.pos_to_string(pos))
|
|
|
|
minetest.get_meta(pos):set_float(furmetakey, 1)
|
2022-05-17 07:03:59 -04:00
|
|
|
return false
|
2022-01-16 15:39:03 -05:00
|
|
|
end
|
|
|
|
})
|
|
|
|
|
2022-01-15 20:14:31 -05:00
|
|
|
local purrtimes = {
|
|
|
|
1.676,
|
|
|
|
1.617,
|
|
|
|
1.642,
|
|
|
|
1.655
|
|
|
|
}
|
|
|
|
|
|
|
|
local hashpos = minetest.hash_node_position
|
|
|
|
local purring = {}
|
|
|
|
|
|
|
|
local purrgain = 0.15
|
|
|
|
|
2022-10-18 22:59:27 -04:00
|
|
|
local function playernear(pos)
|
|
|
|
for _, player in pairs(minetest.get_connected_players()) do
|
|
|
|
local ppos = player:get_pos()
|
|
|
|
ppos.y = ppos.y + player:get_properties().eye_height
|
|
|
|
local diff = vector.subtract(pos, ppos)
|
|
|
|
local dsqr = vector.dot(diff, diff)
|
|
|
|
if dsqr < 25 then return true end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-05-19 20:15:04 -04:00
|
|
|
local normaldraw = {}
|
|
|
|
minetest.after(0, function()
|
|
|
|
for k, v in pairs(minetest.registered_nodes) do
|
|
|
|
if v.drawtype == "normal" then
|
|
|
|
normaldraw[k] = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
2023-05-19 20:11:15 -04:00
|
|
|
local function hearticles(pos, offs, time, qty)
|
2023-05-19 20:15:04 -04:00
|
|
|
if normaldraw[minetest.get_node(pos).name] then return end
|
2023-05-19 20:11:15 -04:00
|
|
|
minetest.add_particlespawner({
|
|
|
|
amount = math_floor(2 * qty),
|
|
|
|
time = time,
|
|
|
|
minpos = vector.add(pos, offs),
|
|
|
|
maxpos = vector.subtract(pos, offs),
|
|
|
|
texture = "nc_cats_heart.png",
|
|
|
|
minexptime = 1,
|
|
|
|
maxexptime = 2,
|
|
|
|
minsize = 1,
|
|
|
|
maxsize = 2,
|
|
|
|
glow = 4
|
|
|
|
})
|
|
|
|
end
|
|
|
|
local function hearticles_all(pos, time, qty)
|
|
|
|
local pdist = 0.55
|
|
|
|
for _, d in pairs({
|
|
|
|
{p = {x = pdist, y = 0, z = 0}, o = {x = 0, y = pdist, z = pdist}},
|
|
|
|
{p = {x = 0, y = pdist, z = 0}, o = {x = pdist, y = 0, z = pdist}},
|
|
|
|
{p = {x = 0, y = 0, z = pdist}, o = {x = pdist, y = pdist, z = 0}},
|
|
|
|
}) do
|
|
|
|
hearticles(vector.add(pos, d.p), d.o, time, qty)
|
|
|
|
hearticles(vector.subtract(pos, d.p), d.o, time, qty)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-05-19 19:34:28 -04:00
|
|
|
local function purr(pos, data)
|
2022-01-18 20:58:48 -05:00
|
|
|
purring[hashpos(pos)] = nodecore.gametime
|
2022-01-16 15:39:03 -05:00
|
|
|
|
2023-05-19 19:34:28 -04:00
|
|
|
local fade = data and data.presstoolpos
|
|
|
|
or math_random(1, 10) == 1 or not playernear(pos)
|
2022-01-16 15:39:03 -05:00
|
|
|
local id = math_random(1, #purrtimes)
|
2022-01-15 20:14:31 -05:00
|
|
|
local sh = nodecore.sound_play("nc_cats_purr_" .. id, {
|
|
|
|
pos = pos,
|
|
|
|
gain = purrgain,
|
|
|
|
not_ephemeral = fade
|
|
|
|
})
|
2023-05-19 20:11:15 -04:00
|
|
|
hearticles_all(pos, purrtimes[id], purrtimes[id])
|
2022-01-15 20:14:31 -05:00
|
|
|
if fade then
|
|
|
|
minetest.sound_fade(sh, -purrgain / purrtimes[id], 0)
|
|
|
|
return minetest.after(purrtimes[id], function()
|
|
|
|
purring[hashpos(pos)] = nil
|
|
|
|
end)
|
|
|
|
else
|
|
|
|
nodecore.dnt_set(pos, modname .. ":purr", purrtimes[id])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
nodecore.register_dnt({
|
|
|
|
name = modname .. ":purr",
|
|
|
|
nodenames = {"group:" .. modname .. "_cat"},
|
|
|
|
action = purr
|
|
|
|
})
|
|
|
|
|
2022-09-24 20:20:43 -04:00
|
|
|
local function furballcheck(pos, node, ejectpos)
|
|
|
|
ejectpos = ejectpos or pos
|
|
|
|
|
2022-01-16 15:39:03 -05:00
|
|
|
local meta = minetest.get_meta(pos)
|
2022-01-22 22:48:57 -05:00
|
|
|
local ready = meta:get_float(furmetakey) or 0
|
|
|
|
if ready > 0 then
|
|
|
|
nodecore.log("action", "cat ejects prill at " .. minetest.pos_to_string(pos))
|
2022-09-24 20:20:43 -04:00
|
|
|
nodecore.item_eject(ejectpos, modname .. ":prill", 5)
|
2022-01-16 15:39:03 -05:00
|
|
|
nodecore.witness(pos, "cat eject prill")
|
2022-01-22 22:48:57 -05:00
|
|
|
meta:set_float(furmetakey, 0)
|
2022-01-16 15:39:03 -05:00
|
|
|
end
|
2022-09-24 20:20:43 -04:00
|
|
|
|
|
|
|
node = node or minetest.get_node(pos)
|
|
|
|
if minetest.get_item_group(node.name, modname .. "_longcat") < 1 then return end
|
|
|
|
local fd = nodecore.facedirs[node.param2]
|
|
|
|
local back = vector.add(pos, fd.k)
|
|
|
|
local bnode = minetest.get_node(back)
|
|
|
|
if myapi.longcatmatch(node, bnode) then
|
|
|
|
return furballcheck(back, bnode, ejectpos)
|
|
|
|
end
|
|
|
|
end
|
2023-05-19 19:34:28 -04:00
|
|
|
local function purrstart(pos, data)
|
2022-09-24 20:20:43 -04:00
|
|
|
furballcheck(pos)
|
2023-05-19 20:11:15 -04:00
|
|
|
hearticles_all(pos, 0.05, 1)
|
2023-05-19 19:34:28 -04:00
|
|
|
return purr(pos, data)
|
2022-01-16 15:39:03 -05:00
|
|
|
end
|
|
|
|
|
2022-01-23 17:46:46 -05:00
|
|
|
function myapi.notpurring(pos)
|
2022-01-18 20:58:48 -05:00
|
|
|
local purrtime = purring[hashpos(pos)]
|
|
|
|
if purrtime and purrtime < nodecore.gametime - 2 then
|
|
|
|
purrtime = nil
|
|
|
|
purring[hashpos(pos)] = nil
|
|
|
|
end
|
|
|
|
return not purrtime and {}
|
|
|
|
end
|
2022-01-15 23:50:55 -05:00
|
|
|
|
2023-05-20 09:51:37 -04:00
|
|
|
local petdef = {
|
|
|
|
label = "pet cat",
|
|
|
|
action = "pummel",
|
|
|
|
indexkeys = {"group:" .. modname .. "_face"},
|
|
|
|
check = function(pos)
|
|
|
|
return myapi.notpurring(pos) and playernear(pos)
|
|
|
|
end,
|
|
|
|
nodes = {
|
|
|
|
{match = {
|
|
|
|
groups = {[modname .. "_cat"] = true},
|
|
|
|
stacked = false
|
|
|
|
}}
|
|
|
|
},
|
|
|
|
after = purrstart
|
|
|
|
}
|
|
|
|
nodecore.register_craft(nodecore.underride({
|
|
|
|
toolgroups = minetest.registered_items[""].tool_capabilities.groupcaps.cuddly
|
|
|
|
and {cuddly = 1} or {thumpy = 1},
|
|
|
|
}, petdef))
|
|
|
|
nodecore.register_craft(nodecore.underride({
|
|
|
|
wield = {groups = {rakey = true}},
|
|
|
|
consumewield = 1,
|
|
|
|
duration = 2
|
|
|
|
}, petdef))
|