medical/engine.lua
2025-01-26 15:14:57 +05:00

160 lines
4.9 KiB
Lua

--[[
Copyright 2025 Andrey Stepanov
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
]]--
local storage = minetest.get_mod_storage()
local dig_penalty_storage = {}
if storage:contains("dig_penalty") then
dig_penalty_storage = minetest.deserialize(
storage:get_string("dig_penalty")
)
end
local speed_factor_storage = {}
if storage:contains("speed_factor") then
speed_factor_storage = minetest.deserialize(
storage:get_string("speed_factor")
)
end
---@param dig_penalty number
local function set_dig_penalty(player, dig_penalty)
local pname = player:get_player_name()
local prev_dig_penalty = dig_penalty_storage[pname] or 1
if dig_penalty == prev_dig_penalty then
return
end
dig_penalty_storage[pname] = dig_penalty
storage:set_string(
"dig_penalty",
minetest.serialize(
dig_penalty_storage
)
)
local inv = player:get_inventory()
local inv_size = inv:get_size("main")
for i = 1, inv_size do
local stack = inv:get_stack("main", i)
if not stack:is_empty() then
toolcap_monoids.dig_speed:del_change(stack, "medical")
if dig_penalty ~= 1 then
toolcap_monoids.dig_speed:add_change(stack, dig_penalty, "medical")
end
inv:set_stack("main", i, stack)
end
end
hand_monoid.monoid:del_change(player, "medical")
local hand_caps = table.copy(hand_monoid.monoid_def.identity.groupcaps)
if dig_penalty ~= 1 then
for group, cap in pairs(hand_caps) do
if cap.times then
for i, _ in pairs(cap.times) do
cap.times[i] = cap.times[i] * dig_penalty
end
end
end
hand_monoid.monoid:add_change(
player,
{
groupcaps = hand_caps
},
"medical"
)
end
end
minetest.register_on_newplayer(
function(player)
hand_monoid.monoid:add_change(
player,
{
groupcaps = table.copy(hand_monoid.monoid_def.identity.groupcaps)
},
"medical"
)
end
)
minetest.register_on_player_inventory_action(
function(
player,
action,
inventory,
inventory_info
)
if action == "put" then
local stack = inventory_info.stack
local dig_penalty = dig_penalty_storage[player:get_player_name()] or 1
if dig_penalty ~= 1 then
toolcap_monoids.dig_speed:add_change(stack, dig_penalty, "medical")
end
elseif action == "take" then
local stack = inventory_info.stack
toolcap_monoids.dig_speed:del_change(stack, "medical")
elseif action == "move" then
if (inventory_info.to_list == "main") and (inventory_info.from_list ~= "main") then
local stack = inventory:get_stack("main", inventory_info.to_index)
toolcap_monoids.dig_speed:del_change(stack, "medical")
local dig_penalty = dig_penalty_storage[player:get_player_name()] or 1
if dig_penalty ~= 1 then
toolcap_monoids.dig_speed:add_change(stack, dig_penalty, "medical")
end
inventory:set_stack("main", inventory_info.to_index, stack)
elseif (inventory_info.from_list == "main") and (inventory_info.to_list ~= "main") then
local stack = inventory:get_stack(inventory_info.to_list, inventory_info.to_index)
toolcap_monoids.dig_speed:del_change(stack, "medical")
inventory:set_stack(inventory_info.to_list, inventory_info.to_index, stack)
end
end
end
)
---@param speed_factor number
local function set_speed(player, speed_factor)
local pname = player:get_player_name()
local prev_speed_factor = speed_factor_storage[pname] or 1
if speed_factor == prev_speed_factor then
return
end
if speed_factor < 0 then
speed_factor = prev_speed_factor
end
speed_factor_storage[pname] = speed_factor
storage:set_string(
"speed_factor",
minetest.serialize(
speed_factor_storage
)
)
player_monoids.speed:del_change(player, "medical")
player_monoids.speed:add_change(player, speed_factor, "medical")
end
minetest.register_on_joinplayer(
function(player, last_login)
set_speed(player, -1)
end
)