1
0
mirror of https://github.com/Splizard/minetest-mod-snow.git synced 2024-12-28 07:30:17 +01:00

automatic snowball throwing in creative mdoe

This commit is contained in:
HybridDog 2015-06-04 13:09:04 +02:00
parent 09a422a0e7
commit 777d5b1407

View File

@ -13,63 +13,66 @@ local function get_gravity()
return grav*snow.snowball_gravity
end
--[[local someone_digging
local timer = 0]]
local someone_throwing
local timer = 0
--Shoot snowball
local function snow_shoot_snowball(item, player)
local pos = player:getpos()
pos.y = pos.y+1.625
local obj = minetest.add_entity(pos, "snow:snowball_entity")
local addp = {y = 1.625} -- + (math.random()-0.5)/5}
local dir = player:get_look_dir()
local dif = 2*math.sqrt(dir.z*dir.z+dir.x*dir.x)
addp.x = dir.z/dif -- + (math.random()-0.5)/5
addp.z = -dir.x/dif -- + (math.random()-0.5)/5
local pos = vector.add(player:getpos(), addp)
local obj = minetest.add_entity(pos, "snow:snowball_entity")
obj:setvelocity(vector.multiply(dir, snow.snowball_velocity))
obj:setacceleration({x=dir.x*-3, y=-get_gravity(), z=dir.z*-3})
if creative_mode then
if not someone_throwing then
someone_throwing = true
timer = -0.5
end
return
end
item:take_item()
return item
end
--[[ simulate the players digging with it using a globalstep
minetest.register_globalstep(function(dtime)
-- abort if noone uses a drill
if not someone_digging then
return
end
if creative_mode then
local function update_step(dtime)
timer = timer+dtime
if timer < 0.006 then
return
end
timer = 0
-- abort that it doesn't dig too fast
timer = timer+dtime
if timer < speed then
return
end
timer = 0
local active
for _,player in pairs(minetest.get_connected_players()) do
if player:get_player_control().LMB then
local item = player:get_wielded_item()
local itemname = item:get_name()
for name,func in pairs(drills) do
if name == itemname then
-- player has a mk3 drill as wielditem and holds left mouse button
local pt = get_pointed_thing(player, ranges[itemname])
if pt then
-- simulate the function
player:set_wielded_item(func(item, player, pt))
end
local active
for _,player in pairs(minetest.get_connected_players()) do
if player:get_player_control().LMB then
local item = player:get_wielded_item()
local itemname = item:get_name()
if itemname == "default:snow" then
snow_shoot_snowball(nil, player)
active = true
break
end
end
end
-- disable the function if noone currently throws them
if not active then
someone_throwing = false
end
end
-- disable the function if noone currently uses a mk3 drill to reduce lag
if not active then
someone_digging = false
end
end)--]]
-- do automatic throwing using a globalstep
minetest.register_globalstep(function(dtime)
-- only if one holds left click
if someone_throwing then
update_step(dtime)
end
end)
end
--The snowball Entity
local snow_snowball_ENTITY = {
@ -80,15 +83,24 @@ local snow_snowball_ENTITY = {
}
function snow_snowball_ENTITY.on_activate(self)
self.object:setacceleration({x=0, y=-get_gravity(), z=0})
self.lastpos = self.object:getpos()
minetest.after(0, function(obj)
if not obj
or obj:getvelocity().y ~= 0 then
minetest.after(0.1, function(obj)
if not obj then
return
end
local vel = obj:getvelocity()
if vel
and vel.y ~= 0 then
return
end
minetest.after(0, function(obj)
if obj
and obj:getvelocity().y == 0 then
if not obj then
return
end
local vel = obj:getvelocity()
if not vel
or vel.y == 0 then
obj:remove()
end
end, obj)