Increase arrow damage smooth dmg/speed increase

Currently using linear increase.
This commit is contained in:
Wuzzy 2018-05-07 16:25:46 +02:00
parent 90363edd59
commit 88ef857fb4
1 changed files with 28 additions and 16 deletions

View File

@ -9,6 +9,10 @@ local BOW_DURABILITY = 385
local BOW_CHARGE_TIME_HALF = 500000 local BOW_CHARGE_TIME_HALF = 500000
local BOW_CHARGE_TIME_FULL = 1000000 local BOW_CHARGE_TIME_FULL = 1000000
-- TODO: Use Minecraft speed (ca. 53 m/s)
-- Currently nerfed because at full speed the arrow would easily get out of the range of the loaded map.
local BOW_MAX_SPEED = 26
local bow_load = {} local bow_load = {}
mcl_throwing.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damage) mcl_throwing.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damage)
@ -78,10 +82,7 @@ minetest.register_tool("mcl_throwing:bow", {
_doc_items_longdesc = "Bows are ranged weapons to shoot arrows at your foes.", _doc_items_longdesc = "Bows are ranged weapons to shoot arrows at your foes.",
_doc_items_usagehelp = [[To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot. _doc_items_usagehelp = [[To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.
The arrow speed and damage increase with the charge level: The arrow speed and damage increase the longer you charge. The minimum damage is 1. At full charge, the damage is 9 with a 20% chance of a critical hit dealing 10 damage instead.]],
Low charge: 1 damage
Medium charge: 2 damage
High charge: 4-5 damage (20% chance for 5 damage)]],
_doc_items_durability = BOW_DURABILITY, _doc_items_durability = BOW_DURABILITY,
inventory_image = "mcl_throwing_bow.png", inventory_image = "mcl_throwing_bow.png",
stack_max = 1, stack_max = 1,
@ -125,26 +126,37 @@ controls.register_on_release(function(player, key, time)
local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) local inv = minetest.get_inventory({type="player", name=player:get_player_name()})
local wielditem = player:get_wielded_item() local wielditem = player:get_wielded_item()
if (wielditem:get_name()=="mcl_throwing:bow_0" or wielditem:get_name()=="mcl_throwing:bow_1" or wielditem:get_name()=="mcl_throwing:bow_2") then if (wielditem:get_name()=="mcl_throwing:bow_0" or wielditem:get_name()=="mcl_throwing:bow_1" or wielditem:get_name()=="mcl_throwing:bow_2") then
local shot = false local has_shot = false
if wielditem:get_name()=="mcl_throwing:bow_0" then
shot = player_shoot_arrow(wielditem, player, 4, 1) local speed, damage
elseif wielditem:get_name()=="mcl_throwing:bow_1" then local charge = minetest.get_us_time() - bow_load[player:get_player_name()]
shot = player_shoot_arrow(wielditem, player, 16, 2) charge = math.max(math.min(charge, BOW_CHARGE_TIME_FULL), 0)
elseif wielditem:get_name()=="mcl_throwing:bow_2" then local charge_ratio = charge / BOW_CHARGE_TIME_FULL
charge_ratio = math.max(math.min(charge_ratio, 1), 0)
-- Calculate damage and speed
-- Fully charged
if charge >= BOW_CHARGE_TIME_FULL then
speed = BOW_MAX_SPEED
local r = math.random(1,5) local r = math.random(1,5)
local damage
-- Damage and range have been nerfed because the arrow charges very quickly -- Damage and range have been nerfed because the arrow charges very quickly
-- TODO: Use Minecraft damage and range (9-10 @ ca. 53 m/s)
if r == 1 then if r == 1 then
-- 20% chance for critical hit -- 20% chance for critical hit
damage = 5 damage = 10
else else
damage = 4 damage = 9
end end
shot = player_shoot_arrow(wielditem, player, 26, damage) -- Partially charged
else
-- Linear speed and damage increase
speed = math.max(4, BOW_MAX_SPEED * charge_ratio)
damage = math.max(1, math.floor(9 * charge_ratio))
end end
has_shot = player_shoot_arrow(wielditem, player, speed, damage)
wielditem:set_name("mcl_throwing:bow") wielditem:set_name("mcl_throwing:bow")
if shot and minetest.settings:get_bool("creative_mode") == false then if has_shot and minetest.settings:get_bool("creative_mode") == false then
wielditem:add_wear(65535/BOW_DURABILITY) wielditem:add_wear(65535/BOW_DURABILITY)
end end
player:set_wielded_item(wielditem) player:set_wielded_item(wielditem)