update item_drop

master
cornernote 2012-08-13 16:18:14 +09:30
parent 3137106df9
commit 924d446bb4
5 changed files with 222 additions and 49 deletions

38
mods/item_drop/README.txt Normal file
View File

@ -0,0 +1,38 @@
===ITEM_DROP MOD for MINETEST-C55===
by PilzAdam
Introduction:
This mod adds Minecraft like drop/pick up of items to Minetest.
How to install:
Unzip the archive an place it in minetest-base-directory/mods/minetest/
if you have a windows client or a linux run-in-place client. If you have
a linux system-wide instalation place it in ~/.minetest/mods/minetest/.
If you want to install this mod only in one world create the folder
worldmods/ in your worlddirectory.
For further information or help see:
http://wiki.minetest.com/wiki/Installing_Mods
How to use the mod:
Just install it an everything works.
License:
Sourcecode: WTFPL (see below)
Sound: WTFPL (see below)
See also:
http://minetest.net/
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.

View File

@ -1,62 +1,135 @@
-- INSTALL INSTRUCTIONS
-- OPEN:
-- builtin/item.lua
-- FIND:
-- digger:get_inventory():add_item("main", dropped_item)
-- REPLACE WITH:
-- local item = minetest.env:add_item(pos,dropped_item);
-- item:get_luaentity().dug_by = digger:get_player_name()
local players = {}
minetest.register_on_joinplayer(function(player)
table.insert(players, player)
end)
minetest.register_on_leaveplayer(function(player)
for key,value in ipairs(players) do
if player:get_player_name() == value:get_player_name() then
table.remove(players, key)
function item_drop(pos, oldnode, digger)
local anzahl = 1
if oldnode.name.items ~= nil then
local drops = {}
local max_items = oldnode.name.max_items
for i,item in ipairs(oldnode.name.items) do
local rarity
if item.rarity == nil then
rarity = 1
else
rarity = item.rarity
end
if math.random(1, rarity) == 1 then
table.insert(drops, item.items[1])
end
if #drops == max_items then
for j,it in ipairs(drops) do
item_drop(pos, {name=it}, digger)
end
return
end
end
return
else
if string.find(oldnode.name, " ") ~= nil then
anzahl = string.sub(oldnode.name, string.find(oldnode.name, " ")+1, string.len(oldnode.name))
oldnode.name = string.sub(oldnode.name, 1, string.find(oldnode.name, " ")-1)
end
end
--table.remove(players, player)
end)
for i=1,anzahl do
if digger:get_inventory():room_for_item("main", ItemStack(oldnode.name)) then
digger:get_inventory():remove_item("main", ItemStack(oldnode.name))
end
local item = minetest.env:add_item(pos, oldnode)
item:get_luaentity().collect = true
local x = math.random(1, 5)
if math.random(1,2) == 1 then
x = -x
end
local z = math.random(1, 5)
if math.random(1,2) == 1 then
z = -z
end
item:setvelocity({x=1/x, y=item:getvelocity().y, z=1/z})
end
end
local item_timer = {}
minetest.register_globalstep(function(dtime)
for i,player in ipairs(players) do
for i,player in ipairs(minetest.get_connected_players()) do
local pos = player:getpos()
pos.y = pos.y+1
pos.y = pos.y+0.5
local items = minetest.env:get_objects_inside_radius(pos,1)
for j,item in ipairs(items) do
if not item:is_player() and item:get_luaentity().itemstring ~= nil then
if item:get_luaentity().dug_by == player:get_player_name() then
if item:get_luaentity().itemstring ~= "" and player:get_inventory():room_for_item("main", ItemStack(item:get_luaentity().itemstring)) then
minetest.debug("[item_drop] Item given: "..item:get_luaentity().itemstring)
player:get_inventory():add_item("main", ItemStack(item:get_luaentity().itemstring))
minetest.sound_play("item_drop_pickup", {
to_player = player,
})
item:remove()
item:get_luaentity().itemstring = ""
end
end
end
end
items = minetest.env:get_objects_inside_radius(pos,3)
for j,item in ipairs(items) do
if not item:is_player() and item:get_luaentity().itemstring ~= nil then
if item:get_luaentity().dug_by == player:get_player_name() then
if player:get_inventory():room_for_item("main", ItemStack(item:get_luaentity().itemstring)) then
local p = player:getpos()
p.y = p.y+0.5
local i = item:getpos()
local move = {x=(p.x-i.x)*15, y=(p.y-i.y)*15, z=(p.z-i.z)*15}
item:setacceleration(move)
end
if item:get_luaentity().itemstring ~= "" and player:get_inventory():room_for_item("main", ItemStack(item:get_luaentity().itemstring)) and item:get_luaentity().collect then
player:get_inventory():add_item("main", ItemStack(item:get_luaentity().itemstring))
minetest.sound_play("item_drop_pickup", {
to_player = player,
})
item:remove()
item:get_luaentity().itemstring = ""
end
end
end
items = minetest.env:get_objects_inside_radius(pos, 2.5)
for j,item in ipairs(items) do
if not item:is_player() and item:get_luaentity().itemstring ~= nil then
if player:get_inventory():room_for_item("main", ItemStack(item:get_luaentity().itemstring)) and item:get_luaentity().collect then
local p = player:getpos()
p.y = p.y+0.5
local i = item:getpos()
local move = {x=(p.x-i.x)*15, y=(p.y-i.y)*15, z=(p.z-i.z)*15}
item:setacceleration(move)
end
if item:get_luaentity().collect == nil and item:get_luaentity().itemstring ~= "" then
if item:get_luaentity().timer == nil then
item:get_luaentity().timer = 0
table.insert(item_timer, item)
end
end
end
end
end
end)
for i,item in ipairs(item_timer) do
item:get_luaentity().timer = item:get_luaentity().timer + dtime
if item:get_luaentity().timer > 1 then
item:get_luaentity().collect = true
table.remove(item_timer, i)
end
end
end)
minetest.after(0, function()
for name,node in pairs(minetest.registered_nodes) do
local func
if node.drop == nil then
if node.after_dig_node == nil then
func = function(pos, oldnode, oldmetadata, digger)
item_drop(pos, oldnode, digger)
end
else
func = function(pos, oldnode, oldmetadata, digger)
item_drop(pos, oldnode, digger)
end
end
else
if node.after_dig_node == nil then
func = function(pos, oldnode, oldmetadata, digger)
oldnode.name = node.drop
item_drop(pos, oldnode, digger)
end
else
func = function(pos, oldnode, oldmetadata, digger)
oldnode.name = node.drop
item_drop(pos, oldnode, digger)
end
end
end
local new_node = {
after_dig_node = func,
stack_max = 64,
}
for str,val in pairs(node) do
new_node[str] = val
end
minetest.register_node(":"..new_node.name, new_node)
end
end)

62
mods/node_drop/init.lua Normal file
View File

@ -0,0 +1,62 @@
-- INSTALL INSTRUCTIONS
-- OPEN:
-- builtin/item.lua
-- FIND:
-- digger:get_inventory():add_item("main", dropped_item)
-- REPLACE WITH:
-- local item = minetest.env:add_item(pos,dropped_item);
-- item:get_luaentity().dug_by = digger:get_player_name()
local players = {}
minetest.register_on_joinplayer(function(player)
table.insert(players, player)
end)
minetest.register_on_leaveplayer(function(player)
for key,value in ipairs(players) do
if player:get_player_name() == value:get_player_name() then
table.remove(players, key)
end
end
--table.remove(players, player)
end)
minetest.register_globalstep(function(dtime)
for i,player in ipairs(players) do
local pos = player:getpos()
pos.y = pos.y+1
local items = minetest.env:get_objects_inside_radius(pos,1)
for j,item in ipairs(items) do
if not item:is_player() and item:get_luaentity().itemstring ~= nil then
if item:get_luaentity().dug_by == player:get_player_name() then
if item:get_luaentity().itemstring ~= "" and player:get_inventory():room_for_item("main", ItemStack(item:get_luaentity().itemstring)) then
minetest.debug("[item_drop] Item given: "..item:get_luaentity().itemstring)
player:get_inventory():add_item("main", ItemStack(item:get_luaentity().itemstring))
minetest.sound_play("item_drop_pickup", {
to_player = player,
})
item:remove()
item:get_luaentity().itemstring = ""
end
end
end
end
items = minetest.env:get_objects_inside_radius(pos,3)
for j,item in ipairs(items) do
if not item:is_player() and item:get_luaentity().itemstring ~= nil then
if item:get_luaentity().dug_by == player:get_player_name() then
if player:get_inventory():room_for_item("main", ItemStack(item:get_luaentity().itemstring)) then
local p = player:getpos()
p.y = p.y+0.5
local i = item:getpos()
local move = {x=(p.x-i.x)*15, y=(p.y-i.y)*15, z=(p.z-i.z)*15}
item:setacceleration(move)
end
end
end
end
end
end)

Binary file not shown.