From 945b9c1f96b6c646b3f50fd7b7515fcd9b7c67b4 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 24 Jul 2022 13:04:15 +0200 Subject: [PATCH] fix throwz module --- mods/throwz/LICENSE.md | 5 + mods/throwz/README.md | 95 ++++++++ mods/throwz/init.lua | 295 +++++++++++++++++++++++++ mods/throwz/locale/throwz.es.tr | 3 + mods/throwz/mod.conf | 1 + mods/throwz/sounds/LICENSE.MD | 11 + mods/throwz/sounds/throwz_hit.ogg | Bin 0 -> 6138 bytes mods/throwz/sounds/throwz_throw.ogg | Bin 0 -> 14673 bytes mods/throwz/textures/throwz_bubble.png | Bin 0 -> 2914 bytes 9 files changed, 410 insertions(+) create mode 100644 mods/throwz/LICENSE.md create mode 100644 mods/throwz/README.md create mode 100644 mods/throwz/init.lua create mode 100644 mods/throwz/locale/throwz.es.tr create mode 100644 mods/throwz/mod.conf create mode 100644 mods/throwz/sounds/LICENSE.MD create mode 100644 mods/throwz/sounds/throwz_hit.ogg create mode 100644 mods/throwz/sounds/throwz_throw.ogg create mode 100755 mods/throwz/textures/throwz_bubble.png diff --git a/mods/throwz/LICENSE.md b/mods/throwz/LICENSE.md new file mode 100644 index 0000000..eaaae91 --- /dev/null +++ b/mods/throwz/LICENSE.md @@ -0,0 +1,5 @@ +# LICENSE + +- Code: GPLv3.0 +- Textures: CC BY-SA 4.0 +- Sounds: They have different licenses, see the LICENSE.MD file inside the /sounds folder. diff --git a/mods/throwz/README.md b/mods/throwz/README.md new file mode 100644 index 0000000..30a6300 --- /dev/null +++ b/mods/throwz/README.md @@ -0,0 +1,95 @@ +# RCTHROW + +## function rcbows.THROW_bow(name, def) + +Example: + +``` +rcthrow.register_throw("throw_weapons:steel_hatchet", { + description = S("Steel Hatchet"), + inventory_image = "throw_weapons_hatchet_inv.png", + wield_image = "throw_weapons_hatchet.png", --optional + throw_image = "throw_weapons_hatchet.png", --optional + strength = 10, + throw_damage = 10, + throw_uses = 30, + throw_sounds = { + max_hear_distance = 10, + gain = 0.6, + }, + recipe = { + {"", "default:steel_ingot", "default:steel_ingot"}, + {"", "group:wood", "default:steel_ingot"}, + {"group:wood", "", ""}, + }, + primary_use = { + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=15, maxlevel=2}, + }, + damage_groups = {fleshy=5}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} + }, +}) +``` + +## Strength + +- The strength definition is maximum value. +- The real throwing strength will depend on the player health. + +## primary_use Definition + +You can use the tool as a regular tool plus throw it. + +1. If you do not define a "primary_use", then the throwing item is launched by using it. + +1. If you define a "primary_use": + +- It is the regular definition of the "minetest.register_tool": tool_capabilities, damage_groups, aound and groups. + +- When you use the item (left-click), this "primary_use" definition applies. + +- When you right-click, the item is thrown. + +## Audio + +1. If you define ``sounds={}``, you get the default sounds. + +For no sound at all do not declare 'sounds'. + +Also you can set the sound parameters 'max_hear_distance' and 'gain'. + +In example: +``` +sounds = { + max_hear_distance = 10, + gain = 0.4, +} +``` + +2. You also can define your own soundfiles. + +You can set "soundfile_throw" and/or "soundfile_hit". + +In example: +``` +sounds = { + soundfile_throw = "my_throw_sound" + soundfile_hit = "my_hit_sound" + max_hear_distance = 5, + --set the gain by default (0.5) +} +``` +## Drop + +By default it is dropped the self throwing item when reachs a solid node. + +If you want not any drop at all, add: +``` +drop = "", +``` diff --git a/mods/throwz/init.lua b/mods/throwz/init.lua new file mode 100644 index 0000000..92b4c5b --- /dev/null +++ b/mods/throwz/init.lua @@ -0,0 +1,295 @@ +throwz = {} + +local S = minetest.get_translator(minetest.get_current_modname()) + +--CONSTANTS +local DEFAULT_MAX_HEAR_DISTANCE = 10 +local DEFAULT_GAIN = 0.5 + +local function spawn_item_ent(item_ent, user, strength, wear) + local player_hp = user:get_hp() + local percent_hp = player_hp / 20 + strength = strength * percent_hp + local dir = user:get_look_dir() + local yaw = user:get_look_horizontal() + local pos = user:get_pos() + pos = vector.add(pos, vector.new(dir.x, 0, dir.z)) + pos.y = pos.y + 1.65 -- camera offset + local obj = nil + if pos and item_ent then + obj = minetest.add_entity(pos, item_ent) + end + if not obj then + return + end + local lua_ent = obj:get_luaentity() + lua_ent.shooter_name = user:get_player_name() + if wear then + lua_ent.wear = wear + end + obj:set_yaw(yaw - 0.5 * math.pi) + local velocity = vector.multiply(dir, strength) + obj:set_velocity(velocity) + return true +end + +local function launch(item_ent, itemstack, user, name, def) + local wear + if def.type == "tool" then + wear = itemstack:get_wear() + 0x10000 / def.throw_uses + else + wear = nil + end + --minetest.chat_send_all(tostring(wear)) + if not spawn_item_ent(item_ent, user, def.strength, wear) then --throw item (spawn item entity) + return -- something failed + end + if def.throw_sounds then + local user_pos = user:get_pos() + if not def.throw_sounds.soundfile_throw then + def.throw_sounds.soundfile_throw = "throwz_throw" + end + throwz.make_sound("pos", user_pos, def.throw_sounds.soundfile_throw, DEFAULT_GAIN, DEFAULT_MAX_HEAR_DISTANCE) + end +end + +function throwz.register_throw(name, def) + assert(type(def.description) == "string") + assert(type(def.inventory_image) == "string") + assert(type(def.wield_image) == "string") + assert(type(def.throw_damage) == "number") + assert(type(def.strength) == "number") + assert(type(def.recipe) == "table") + + local item_ent = name .. "_ent" + + local howto_use_msg + if not def.primary_use then + howto_use_msg = S("(use to throw)") + else + howto_use_msg = S("(right-click to throw)") + end + + local description = def.description .. " " .. howto_use_msg + + if def.type == "tool" then + + assert(def.throw_uses > 0) + assert(type(def.primary_use) == "table") + + def.primary_use.groups["throw"] = 1 + + minetest.register_tool(name, { + description = description, + inventory_image = def.inventory_image, + wield_image = def.wield_image or def.inventory_image, + groups = def.primary_use.groups, + tool_capabilities = def.primary_use.tool_capabilities, + sound = def.primary_use.sound, + + on_use = function(itemstack, user, pointed_thing) + if not def.primary_use then + launch(item_ent, itemstack, user, name, def) + else + if pointed_thing.type == "object" then + if pointed_thing.ref then + pointed_thing.ref:punch(user, nil, def.primary_use.tool_capabilities, nil) + end + end + end + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + if def.primary_use then + launch(item_ent, itemstack, user, name, def) + end + itemstack:take_item() + return itemstack + end, + + }) + else + minetest.register_craftitem(name, { + description = description, + inventory_image = def.inventory_image, + wield_image = def.wield_image or def.inventory_image, + groups = def.groups, + + on_use = function(itemstack, user, pointed_thing) + launch(item_ent, itemstack, user, name, def) + itemstack:take_item() + return itemstack + end, + }) + end + + if def.recipe then + minetest.register_craft({ + output = name, + recipe = def.recipe + }) + end + + minetest.register_entity(item_ent, { + hp_max = 15, -- possible to catch the throw (pro skills) + physical = false, -- use Raycast + collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + visual = "wielditem", + textures = {name}, + visual_size = {x = 0.2, y = 0.15}, + old_pos = nil, + velocity = nil, + liquidflag = nil, + shooter_name = "", + waiting_for_removal = false, + static_save = true, + groups = {throw = 1}, + + on_activate = function(self) + self.object:set_acceleration({x = 0, y = -9.81, z = 0}) + end, + + on_step = function(self, dtime) + if self.waiting_for_removal then + self.object:remove() + return + end + local pos = self.object:get_pos() + self.old_pos = self.old_pos or pos + local velocity = self.object:get_velocity() + if def.throw_sounds and not(def.throw_sounds.soundfile_hit) then + def.throw_sounds.soundfile_hit = "throwz_hit" + end + local cast = minetest.raycast(self.old_pos, pos, true, true) + local thing = cast:next() + while thing do + if thing.type == "object" and thing.ref ~= self.object then + if not thing.ref:is_player() or thing.ref:get_player_name() ~= self.shooter_name then + thing.ref:punch(self.object, 1.0, { + full_punch_interval = 0.5, + damage_groups = {fleshy = def.throw_damage or 1} + }) + self.waiting_for_removal = true + self.object:remove() + + if def.throw_sounds then + local thing_pos = thing.ref:get_pos() + if thing_pos then + throwz.make_sound("pos", thing_pos, def.throw_sounds.soundfile_hit, DEFAULT_GAIN, DEFAULT_MAX_HEAR_DISTANCE) + end + end + + -- no effects or not owner, nothing to do. + -- some effects should also happen if hitting an other object. like tnt, water etc. + if not def.effects or minetest.is_protected(pos, self.shooter_name) then + return + end + + return + end + elseif thing.type == "node" then + local node_name = minetest.get_node(thing.under).name + local drawtype = minetest.registered_nodes[node_name]["drawtype"] + if drawtype == 'liquid' then + if not self.liquidflag then + self.velocity = velocity + self.liquidflag = true + local liquidviscosity = minetest.registered_nodes[node_name]["liquid_viscosity"] + local drag = 1/(liquidviscosity*6) + self.object:set_velocity(vector.multiply(velocity, drag)) + self.object:set_acceleration({x = 0, y = -1.0, z = 0}) + throwz.splash(self.old_pos, "throwz_bubble.png") + end + elseif self.liquidflag then + self.liquidflag = false + if self.velocity then + self.object:set_velocity(self.velocity) + end + self.object:set_acceleration({x = 0, y = -9.81, z = 0}) + end + + if minetest.registered_items[node_name].walkable then + + if not(def.drop) then + if not(def.drop == "") then + local drop_item = ItemStack(name) + if self.wear then + drop_item:set_wear(self.wear) + end + local drop_pos = self.old_pos + local item_ref = minetest.add_item(drop_pos, drop_item) + --minetest.item_drop(drop_item, nil, drop_pos) + if item_ref and def.boom then + minetest.after(def.boom.delay or 0, function() + for _, obj in ipairs(minetest.get_objects_inside_radius(drop_pos, 1)) do + if obj == item_ref then + item_ref:remove() + boomz.boom(drop_pos, def.boom.radius, def.boom.player_damage) + end + end + end, drop_pos) + end + end + end + + self.waiting_for_removal = true + self.object:remove() + + if def.throw_sounds then + if pos then + throwz.make_sound("pos", pos, def.throw_sounds.soundfile_hit, DEFAULT_GAIN, DEFAULT_MAX_HEAR_DISTANCE) + end + end + + -- no effects or not owner, nothing to do. + if not def.effects or minetest.is_protected(pos, self.shooter_name) then + return + end + + return + end + end + thing = cast:next() + end + + self.old_pos = pos + + end, + }) + +end + +--SOUND SYSTEM + +function throwz.make_sound(dest_type, dest, soundfile, gain, max_hear_distance) + if dest_type == "object" then + minetest.sound_play(soundfile, {object = dest, gain = gain or DEFAULT_GAIN, max_hear_distance = max_hear_distance or DEFAULT_MAX_HEAR_DISTANCE,}) + elseif dest_type == "player" then + local player_name = dest:get_player_name() + minetest.sound_play(soundfile, {to_player = player_name, gain = gain or DEFAULT_GAIN, max_hear_distance = max_hear_distance or DEFAULT_MAX_HEAR_DISTANCE,}) + elseif dest_type == "pos" then + minetest.sound_play(soundfile, {pos = dest, gain = gain or DEFAULT_GAIN, max_hear_distance = max_hear_distance or DEFAULT_MAX_HEAR_DISTANCE,}) + end +end + +function throwz.splash(old_pos, splash_particle) + minetest.add_particlespawner({ + amount = 5, + time = 1, + minpos = old_pos, + maxpos = old_pos, + minvel = {x=1, y=1, z=0}, + maxvel = {x=1, y=1, z=0}, + minacc = {x=1, y=1, z=1}, + maxacc = {x=1, y=1, z=1}, + minexptime = 0.2, + maxexptime = 0.5, + minsize = 1, + maxsize = 1, + collisiondetection = false, + vertical = false, + texture = splash_particle, + playername = "singleplayer" + }) +end diff --git a/mods/throwz/locale/throwz.es.tr b/mods/throwz/locale/throwz.es.tr new file mode 100644 index 0000000..18d3eb2 --- /dev/null +++ b/mods/throwz/locale/throwz.es.tr @@ -0,0 +1,3 @@ +# textdomain: throwz +(use to throw)=(usar para lanzar) +(right-click to throw)=(click-derecho para lanzar) diff --git a/mods/throwz/mod.conf b/mods/throwz/mod.conf new file mode 100644 index 0000000..5b7d0c7 --- /dev/null +++ b/mods/throwz/mod.conf @@ -0,0 +1 @@ +name = throwz diff --git a/mods/throwz/sounds/LICENSE.MD b/mods/throwz/sounds/LICENSE.MD new file mode 100644 index 0000000..6bfb1a9 --- /dev/null +++ b/mods/throwz/sounds/LICENSE.MD @@ -0,0 +1,11 @@ +-------------------------------------------- +file name: rcthrow_throw.ogg +Author: Connersaw64 +https://freesound.org/people/Connersaw64/sounds/199823/ +License: This work is licensed under the Creative Commons 0 License. +------------------------------- +file name: rcthrow_hit.ogg +Author: carlmartin +https://freesound.org/people/carlmartin/sounds/158925/ +License: This work is licensed under the Creative Commons 0 License. +-------------------------------------------- diff --git a/mods/throwz/sounds/throwz_hit.ogg b/mods/throwz/sounds/throwz_hit.ogg new file mode 100644 index 0000000000000000000000000000000000000000..27d39b15aa40c49f8787557514215ea05ad4e12e GIT binary patch literal 6138 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 V3XD$w@*ipLwT90JI`vZZ{~H#l3Aq3O literal 0 HcmV?d00001 diff --git a/mods/throwz/sounds/throwz_throw.ogg b/mods/throwz/sounds/throwz_throw.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b79b09c52d57d8556ee846342bd9e191b9269813 GIT binary patch literal 14673 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