From be91fbf82a59538f520ac5f4541bfb057cba93bc Mon Sep 17 00:00:00 2001 From: whosit Date: Wed, 10 May 2023 13:10:00 +0300 Subject: [PATCH] initial prototype --- LICENSE.txt | 19 +++++ init.lua | 162 +++++++++++++++++++++++++++++++++++++ mod.conf | 4 + sounds/dvornik_pickup.ogg | Bin 0 -> 5096 bytes sounds/dvornik_sweep.ogg | Bin 0 -> 10360 bytes textures/dvornik_venik.png | Bin 0 -> 210 bytes 6 files changed, 185 insertions(+) create mode 100755 LICENSE.txt create mode 100755 init.lua create mode 100755 mod.conf create mode 100755 sounds/dvornik_pickup.ogg create mode 100755 sounds/dvornik_sweep.ogg create mode 100755 textures/dvornik_venik.png diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100755 index 0000000..5274d88 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2023 whosit + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/init.lua b/init.lua new file mode 100755 index 0000000..22ad6cc --- /dev/null +++ b/init.lua @@ -0,0 +1,162 @@ +local MODNAME = "dvornik" +local VENIK_ACTIVE_TIME = 0.55 +local DEBUG = true + +local active_veniks = {} + +local function is_venik_active(player) + return active_veniks[player] +end + +local function deactivate_venik(player) + active_veniks[player] = nil +end + +local function activate_venik(player, venik) + -- FIXME venik is not used + if is_venik_active(player) then + return + end + minetest.sound_play('dvornik_sweep', { + pos = player:get_pos(), + max_hear_distance = 10 + }) + active_veniks[player] = minetest.after(VENIK_ACTIVE_TIME, deactivate_venik, player) +end + +minetest.register_tool( + "dvornik:venik", { + description = "A venik for a dvornik", + inventory_image = "dvornik_venik.png", + --wield_scale = {x = 1, y = -1, z = 1}, + on_use = function(itemstack, user, pointed_thing) + if not (user and user:is_player()) then + return itemstack + end + -- TODO change it's visuals while active? + activate_venik(user, itemstack) + + -- TODO short cooldown? + return itemstack + end, + tool_capabilities = { + full_punch_inverval = VENIK_ACTIVE_TIME * 10 + } + } +) + +if DEBUG then + minetest.register_tool( + "dvornik:garbage", { + description = "A garbage for a dvornik to clean up", + inventory_image = "garbage.png", + on_use = function(itemstack, user, pointed_thing) + local garbage_list = { + "dirt", "cobble", "wood", "stick", "coal_lump", "gold_lump", "apple", "sand", "steel_ingot", + "copper_ingot" + } + if not (user and user:is_player()) then + return itemstack + end + + local pos = user:get_pos() + for i = 1, 3 do + for _, item in pairs(garbage_list) do + local r = 4.0 + local p = vector.add(pos, vector.new((math.random() - 0.5) * r, 0.5, (math.random() - 0.5) * r)) + minetest.add_item(p, "default:" .. item) + end + end + return itemstack + end + } + ) +end + +local function player_get_eye_pos(player) + local p_pos = player:get_pos() + local p_eye_height = player:get_properties().eye_height + p_pos.y = p_pos.y + p_eye_height + local p_eye_pos = p_pos + local p_eye_offset = vector.multiply(player:get_eye_offset(), 0.1) + local yaw = player:get_look_horizontal() + p_eye_pos = vector.add(p_eye_pos, vector.rotate_around_axis(p_eye_offset, { x = 0, y = 1, z = 0 }, yaw)) + return p_eye_pos +end + + +local function add_debug_particle(pos) + minetest.add_particle({ + pos = pos, + expirationtime = 2, + size = 1, + texture = "test.png" + + }) +end + +-- TODO recheck if player leaving the server is not crashing it + +local RANGE = 3.0 +--local RADIUS = 1.0 +local function trace_and_pickup(player) + local p_eye_pos = player_get_eye_pos(player) + local to = vector.add(p_eye_pos, vector.multiply(player:get_look_dir(), RANGE)) + local ray = minetest.raycast( + p_eye_pos, + to, + true, -- point to objects + false) -- point to liquids + local pointed_thing = ray:next() + while pointed_thing do + if DEBUG and pointed_thing.type ~= "nothing" and not (pointed_thing.type == "object" and pointed_thing.ref == player) then + local point = pointed_thing.intersection_point + add_debug_particle(point) + end + if pointed_thing.type == "object" then + if pointed_thing.ref ~= player then -- exclude the player themselves from the raycast + -- "pickup" + -- for _, obj in pairs(minetest.get_objects_inside_radius(point, RADIUS)) do + -- obj:remove() + -- end + local item = pointed_thing.ref:get_luaentity() + -- TODO check if we can pick up more item + -- TODO if can't pick up any more items, then maybe move the item entity a bit? + if item.on_punch then -- TODO probaly don't need this check + item:on_punch(player) + minetest.sound_play("dvornik_pickup", { + to_player = player:get_player_name() + --pos = player:get_pos(), + --max_hear_distance = 10 + }) + minetest.add_particle({ + pos = pointed_thing.ref:get_pos(), + expirationtime = 1, + size = 1, + texture = "test.png" -- TODO + + }) + end + end + end + pointed_thing = ray:next() + end +end + +local timer = 0 +minetest.register_globalstep(function(_dtime) + for player, _ in pairs(active_veniks) do + trace_and_pickup(player) + end +end +) + +minetest.register_on_leaveplayer(function(player, timed_out) + deactivate_venik(player) +end) + +-- minetest.register_on_item_pickup(function(itemstack, picker, pointed_thing, time_from_last_punch, ...) +-- end) + +-- minetest.item_pickup(itemstack, picker, pointed_thing, time_from_last_punch, ...) +-- on_pickup diff --git a/mod.conf b/mod.conf new file mode 100755 index 0000000..5ec03eb --- /dev/null +++ b/mod.conf @@ -0,0 +1,4 @@ +name = dvornik +description = +depends = +optional_depends = \ No newline at end of file diff --git a/sounds/dvornik_pickup.ogg b/sounds/dvornik_pickup.ogg new file mode 100755 index 0000000000000000000000000000000000000000..e16da9645b747113a86a4032e36640d4d9e32afb GIT binary patch literal 5096 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 literal 0 HcmV?d00001