snowballs

master
stujones11 2019-05-11 21:27:38 +01:00
parent 24b684ca39
commit c95e292e20
3 changed files with 121 additions and 29 deletions

View File

@ -136,7 +136,10 @@ function boat.on_punch(self, puncher)
end
if not self.driver then
self.removed = true
if not (creative and creative.is_enabled_for
local inv = puncher:get_inventory()
if not inv then
minetest.add_item(self.object:get_pos(), "boats:boat")
elseif not (creative and creative.is_enabled_for
and creative.is_enabled_for(name))
or not inv:contains_item("main", "boats:boat") then
local leftover = inv:add_item("main", "boats:boat")
@ -341,4 +344,4 @@ minetest.register_craft({
type = "fuel",
recipe = "boats:boat",
burntime = 20,
})
})

View File

@ -2,6 +2,7 @@ local player_inventory = {}
local inventory_cache = {}
local ofs = {}
local ofy = {}
local hoch = {}
local bg = {}
@ -18,6 +19,19 @@ ofs["brew"] = {x=4.78, y=8.12}
ofs["matr"] = {x=3.495, y=8.12}
ofs["inv"] = {x=8.99, y=8.12}
ofy["blocks"] = 0.24
ofy["deco"] = 0.24
ofy["mese"] = 0.24
ofy["rail"] = 0.24
ofy["misc"] = 0.24
ofy["all"] = 0.24
ofy["food"] = 0.14
ofy["tools"] = 0.14
ofy["combat"] = 0.14
ofy["brew"] = 0.14
ofy["matr"] = 0.14
ofy["inv"] = 0.14
hoch["blocks"] = ""
hoch["deco"] = ""
hoch["mese"] = ""
@ -32,15 +46,15 @@ hoch["matr"] = "^[transformfy"
hoch["inv"] = "^[transformfy"
bg["blocks"] = "default_grass_side.png"
bg["deco"] = "default_sapling.png"
bg["mese"] = "jeija_lightstone_gray_on.png"
bg["deco"] = "creative_deko.png"
bg["mese"] = "creative_mese.png"
bg["rail"] = "boats_inventory.png"
bg["misc"] = "bucket_water.png"
bg["all"] = "creative_all.png"
bg["food"] = "creative_food.png"
bg["tools"] = "default_tool_diamondpick.png"
bg["combat"] = "default_tool_steelsword.png"
bg["brew"] = "potions_bottle.png"
bg["tools"] = "creative_tool.png"
bg["combat"] = "creative_sword.png"
bg["brew"] = "creative_brew.png"
bg["matr"] = "default_emerald.png"
bg["inv"] = "creative_inv.png"
@ -153,6 +167,7 @@ creative.formspec_add = ""
local function get_creative_formspec(player_name, start_i, pagenum, page, pagemax)
pagenum = math.floor(pagenum) or 1
pagemax = (pagemax and pagemax ~= 0) and pagemax or 1
local slider_height = 4 / pagemax
local slider_pos = slider_height * (pagenum - 1) + 2.2
local formspec = ""
@ -193,7 +208,7 @@ local function get_creative_formspec(player_name, start_i, pagenum, page, pagema
"image_button[9.19,8.28;1,1;"..bg["inv"]..";inv;;;false]".. --inventory
"list[detached:creative_trash;main;9.02,7.02;1,1;]"..
"image["..ofs[name].x..", "..ofs[name].y..";1.5,1.44;creative_active.png"..hoch[name].."]"..
"image["..(ofs[name].x + 0.17)..", "..(ofs[name].y + 0.14)..";1,1;"..bg[name].."]"..
"image["..(ofs[name].x + 0.17)..", "..(ofs[name].y + ofy[name])..";1,1;"..bg[name].."]"..
"image[9.04," .. tostring(slider_pos) .. ";0.78,"..tostring(slider_height) .. ";creative_slider.png]"
if name == "all" then

View File

@ -555,40 +555,114 @@ minetest.register_abm({
--
-- Snowballs
--
--[[
-- Shoot snowball
snow_shoot_snowball = function (item, player, pointed_thing)
local playerpos = player:get_pos()
local obj = minetest.add_entity({x = playerpos.x, y = playerpos.y + 1.5, z = playerpos.z}, "default:snowball_entity")
local dir = player:get_look_dir()
obj:setvelocity({x = dir.x * 19, y = dir.y * 19, z = dir.z * 19})
obj:set_acceleration({x = dir.x * -3, y = -9.81, z = dir.z * -3})
item:take_item()
local pos = player:get_pos()
local obj = minetest.add_entity({x=pos.x, y=pos.y + 1.5, z=pos.z},
"default:snowball_entity")
if obj then
local ent = obj:get_luaentity()
if ent then
ent.thrower = player:get_player_name()
local dir = player:get_look_dir()
obj:setvelocity({x = dir.x * 19, y = dir.y * 19, z = dir.z * 19})
obj:set_acceleration({x = dir.x * -3, y = -9.81, z = dir.z * -3})
item:take_item()
else
obj:remove()
end
end
return item
end
-- Snowball entity
snowball_ENTITY = {
local snowball_entity = {
physical = false,
textures = "default_snowball.png",
lastpos = "",
collisionbox = {0,0,0,0,0,0},
textures = {
"default_snow.png",
"default_snow.png",
"default_snow.png",
"default_snow.png",
"default_snow.png",
"default_snow.png",
},
visual = "cube",
visual_size = {x=0.25, y=0.25},
thrower = nil,
timer = 0,
lastpos = {},
collisionbox = {0,0,0, 0,0,0},
on_activate = function(self, staticdata)
if staticdata == "expired" then
self.object:remove()
end
end,
get_staticdata = function()
return "expired"
end,
}
-- Called when snowball is moving.
snowball_ENTITY.on_step = function(self)
snowball_entity.on_step = function(self, dtime)
self.timer = self.timer + dtime
if self.timer > 20 then
self.object:remove()
return
end
if not self.thrower then
return
end
local drop_pos = nil
local pos = self.object:getpos()
local node = minetest.get_node(pos)
-- Become item when hitting a node.
-- If there is no lastpos for some reason.
if self.lastpos.x ~= nil then
if node.name ~= "air" then
self.object:remove()
local objs = minetest.get_objects_inside_radius({x=pos.x, y=pos.y, z=pos.z}, 1)
for _, obj in pairs(objs) do
if obj:is_player() then
local name = obj:get_player_name()
if name ~= self.thrower then
drop_pos = obj:getpos()
end
elseif obj:get_luaentity() ~= nil and
obj:get_luaentity().name ~= "default:snowball_entity" then
drop_pos = obj:getpos()
end
end
-- Node will be added at last pos outside the node
self.lastpos = {x = pos.x, y = pos.y, z = pos.z}
if node.name ~= "air" and node.name ~= "ignore" then
for i = 1, 3 do
local p = {x=pos.x, y=pos.y + i, z=pos.z}
local n = minetest.get_node(p)
if n.name == "air" then
drop_pos = vector.new(p)
break
end
end
if not drop_pos then
self.object:remove()
return
end
end
if drop_pos then
node = minetest.get_node(drop_pos)
if node.name == "air" then
local pos_under = vector.subtract(drop_pos, {x=0, y=1, z=0})
node = minetest.get_node(pos_under)
if node.name then
local def = minetest.registered_items[node.name] or {}
if def.buildable_to == true then
minetest.add_node(pos_under, {name="default:snow"})
elseif def.walkable == true then
minetest.add_node(drop_pos, {name="default:snow"})
end
end
elseif node.name then
local def = minetest.registered_items[node.name]
if def and def.buildable_to == true then
minetest.add_node(drop_pos, {name="default:snow"})
end
end
self.object:remove()
end
end
minetest.register_entity("default:snowball_entity", snowball_entity)]]--
minetest.register_entity("default:snowball_entity", snowball_entity)