Add files via upload

master
Trent Patterson 2018-02-15 12:00:46 -05:00 committed by GitHub
parent 22bd43c254
commit c1872df756
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 545 additions and 91 deletions

View File

@ -0,0 +1,229 @@
-- Minetest: builtin/item_entity.lua
function core.spawn_item(pos, item)
-- Take item in any format
local stack = ItemStack(item)
local obj = core.add_entity(pos, "__builtin:item")
-- Don't use obj if it couldn't be added to the map.
if obj then
obj:get_luaentity():set_item(stack:to_string())
end
return obj
end
-- If item_entity_ttl is not set, enity will have default life time
-- Setting it to -1 disables the feature
local time_to_live = tonumber(core.settings:get("item_entity_ttl"))
if not time_to_live then
time_to_live = 900
end
core.register_entity(":__builtin:item", {
initial_properties = {
hp_max = 1,
physical = true,
collide_with_objects = false,
collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3},
visual = "wielditem",
visual_size = {x = 0.4, y = 0.4},
textures = {""},
spritediv = {x = 1, y = 1},
initial_sprite_basepos = {x = 0, y = 0},
is_visible = false,
},
itemstring = '',
physical_state = true,
age = 0,
set_item = function(self, itemstring)
self.itemstring = itemstring
local stack = ItemStack(itemstring)
local count = stack:get_count()
local max_count = stack:get_stack_max()
if count > max_count then
count = max_count
self.itemstring = stack:get_name().." "..max_count
end
local s = 0.2 + 0.1 * (count / max_count)
local c = s
local itemtable = stack:to_table()
local itemname = nil
if itemtable then
itemname = stack:to_table().name
end
-- Backwards compatibility: old clients use the texture
-- to get the type of the item
local item_texture = nil
local item_type = ""
if core.registered_items[itemname] then
item_texture = core.registered_items[itemname].inventory_image
item_type = core.registered_items[itemname].type
end
local prop = {
is_visible = true,
visual = "wielditem",
textures = {itemname},
visual_size = {x = s, y = s},
collisionbox = {-c, -c, -c, c, c, c},
automatic_rotate = math.pi * 0.5,
wield_item = itemstring,
}
self.object:set_properties(prop)
end,
get_staticdata = function(self)
return core.serialize({
itemstring = self.itemstring,
always_collect = self.always_collect,
age = self.age,
dropped_by = self.dropped_by
})
end,
on_activate = function(self, staticdata, dtime_s)
if string.sub(staticdata, 1, string.len("return")) == "return" then
local data = core.deserialize(staticdata)
if data and type(data) == "table" then
self.itemstring = data.itemstring
self.always_collect = data.always_collect
if data.age then
self.age = data.age + dtime_s
else
self.age = dtime_s
end
self.dropped_by = data.dropped_by
end
else
self.itemstring = staticdata
end
self.object:set_armor_groups({immortal = 1})
self.object:setvelocity({x = 0, y = 2, z = 0})
self.object:setacceleration({x = 0, y = -10, z = 0})
self:set_item(self.itemstring)
end,
-- moves items from this stack to an other stack
try_merge_with = function(self, own_stack, object, obj)
-- other item's stack
local stack = ItemStack(obj.itemstring)
-- only merge if items are the same
if own_stack:get_name() == stack:get_name() and
own_stack:get_meta() == stack:get_meta() and
own_stack:get_wear() == stack:get_wear() and
stack:get_free_space() > 0 then
local overflow = false
local count = stack:get_count() + own_stack:get_count()
local max_count = stack:get_stack_max()
if count > max_count then
overflow = true
stack:set_count(max_count)
count = count - max_count
own_stack:set_count(count)
else
self.itemstring = ''
stack:set_count(count)
end
local pos = object:getpos()
pos.y = pos.y + (count - stack:get_count()) / max_count * 0.15
object:moveto(pos, false)
local s, c
if not overflow then
obj.itemstring = stack:to_string()
s = 0.2 + 0.1 * (count / max_count)
c = s
object:set_properties({
visual_size = {x = s, y = s},
collisionbox = {-c, -c, -c, c, c, c},
wield_item = obj.itemstring
})
self.object:remove()
-- merging succeeded
return true
else
s = 0.4
c = 0.3
obj.itemstring = stack:to_string()
object:set_properties({
visual_size = {x = s, y = s},
collisionbox = {-c, -c, -c, c, c, c},
wield_item = obj.itemstring
})
s = 0.2 + 0.1 * (count / max_count)
c = s
self.itemstring = own_stack:to_string()
self.object:set_properties({
visual_size = {x = s, y = s},
collisionbox = {-c, -c, -c, c, c, c},
wield_item = self.itemstring
})
end
end
-- merging didn't succeed
return false
end,
on_step = function(self, dtime)
self.age = self.age + dtime
if time_to_live > 0 and self.age > time_to_live then
self.itemstring = ''
self.object:remove()
return
end
local p = self.object:getpos()
p.y = p.y - 0.5
local node = core.get_node_or_nil(p)
local in_unloaded = (node == nil)
if in_unloaded then
-- Don't infinetly fall into unloaded map
self.object:setvelocity({x = 0, y = 0, z = 0})
self.object:setacceleration({x = 0, y = 0, z = 0})
self.physical_state = false
self.object:set_properties({physical = false})
return
end
local nn = node.name
-- If node is not registered or node is walkably solid and resting on nodebox
local v = self.object:getvelocity()
if not core.registered_nodes[nn] or core.registered_nodes[nn].walkable and v.y == 0 then
if self.physical_state then
local own_stack = ItemStack(self.object:get_luaentity().itemstring)
-- Merge with close entities of the same item
for _, object in ipairs(core.get_objects_inside_radius(p, 0.8)) do
local obj = object:get_luaentity()
if obj and obj.name == "__builtin:item"
and obj.physical_state == false then
if self:try_merge_with(own_stack, object, obj) then
return
end
end
end
self.object:setvelocity({x = 0, y = 0, z = 0})
self.object:setacceleration({x = 0, y = 0, z = 0})
self.physical_state = false
self.object:set_properties({physical = false})
end
else
if not self.physical_state then
self.object:setvelocity({x = 0, y = 0, z = 0})
self.object:setacceleration({x = 0, y = -10, z = 0})
self.physical_state = true
self.object:set_properties({physical = true})
end
end
end,
on_punch = function(self, hitter)
local inv = hitter:get_inventory()
if inv and self.itemstring ~= '' then
local left = inv:add_item("main", self.itemstring)
if left and not left:is_empty() then
self.itemstring = left:to_string()
return
end
end
self.itemstring = ''
self.object:remove()
end,
})

View File

@ -0,0 +1,204 @@
-- I want to give credit to: Splizard for their minetest-mod-snow https://github.com/Splizard/minetest-mod-snow/blob/master/src/snowball.lua
-- Thank you!
local creative_mode = minetest.settings:get_bool"creative_mode"
local ninjastar_velocity, entity_attack_delay
local function update_ninjastar_vel(v)
ninjastar_velocity = v
local walkspeed = tonumber(minetest.settings:get"movement_speed_walk") or 4
entity_attack_delay = (walkspeed+1)/v
end
update_ninjastar_vel(ninjastarmod.ninjastar_velocity)
local ninjastar_gravity = ninjastarmod.ninjastar_gravity
ninjastarmod.register_on_configuring(function(name, v)
if name == "ninjastar_velocity" then
update_ninjastar_vel(v)
elseif name == "ninjastar_gravity" then
ninjastar_gravity = v
end
end)
local function get_gravity()
local grav = tonumber(minetest.settings:get"movement_gravity") or 9.81
return grav*ninjastar_gravity
end
local someone_throwing, just_acitvated
--Shoot snowball
function ninjastarmod.shoot_ninjastar(item, player)
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, "ninjastarmod:EntityNinjaStar_wood")
obj:setvelocity(vector.multiply(dir, ninjastar_velocity))
obj:setacceleration({x=dir.x*-3, y=-get_gravity(), z=dir.z*-3})
obj:get_luaentity().thrower = player:get_player_name()
if creative_mode then
if not someone_throwing then
someone_throwing = true
just_acitvated = true
end
return
end
item:take_item()
return item
end
if creative_mode then
local function update_step()
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 == "ninjastarmod:ItemNinjaStar_wood" then
ninjastarmod.shoot_ninjastar(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
-- do automatic throwing using minetest.after
local function do_step()
local timer
-- only if one holds left click
if someone_throwing
and not just_acitvated then
update_step()
timer = 0.006
else
timer = 0.5
just_acitvated = false
end
minetest.after(timer, do_step)
end
minetest.after(3, do_step)
end
--The NinjaStar Entity
local EntityNinjaStar_wood = {
physical = false,
timer = 0,
collisionbox = {-5/16,-5/16,-5/16, 5/16,5/16,5/16},
}
function EntityNinjaStar_wood.on_activate(self)
self.object:set_properties({textures = {"ItemNinjaStar_wood.png^[transform"..math.random(0,7)}})
self.object:setacceleration({x=0, y=-get_gravity(), z=0})
self.lastpos = self.object:getpos()
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 not obj then
return
end
local vel = obj:getvelocity()
if not vel
or vel.y == 0 then
obj:remove()
end
end, obj)
end, self.object)
end
--Snowball_entity.on_step()--> called when snowball is moving.
function EntityNinjaStar_wood.on_step(self, dtime)
self.timer = self.timer+dtime
if self.timer > 600 then
-- 10 minutes are too long for a snowball to fly somewhere
self.object:remove()
return
end
if self.physical then
local fell = self.object:getvelocity().y == 0
if not fell then
return
end
local pos = vector.round(self.object:getpos())
if minetest.get_node(pos).name == "air" then
pos.y = pos.y-1
if minetest.get_node(pos).name == "air" then
return
end
end
snow.place(pos)
self.object:remove()
return
end
local pos = vector.round(self.object:getpos())
if vector.equals(pos, self.lastpos) then
return
end
if minetest.get_node(pos).name ~= "air" then
self.object:setacceleration({x=0, y=-get_gravity(), z=0})
--self.object:setvelocity({x=0, y=0, z=0})
pos = self.lastpos
self.object:setpos(pos)
minetest.sound_play("NinjaStarHit", {pos=pos, gain=vector.length(self.object:getvelocity())/30})
self.object:set_properties({physical = true})
self.physical = true
return
end
self.lastpos = vector.new(pos)
if self.timer < entity_attack_delay then
return
end
for _,v in pairs(minetest.get_objects_inside_radius(pos, 1.73)) do
local entity = v:get_luaentity()
if v ~= self.object
and entity then
local entity_name = entity.name
if v:is_player()
or (entity_name ~= "ninjastarmod:EntityNinjaStar_wood"
and entity_name ~= "__builtin:item"
and entity_name ~= "gauges:hp_bar") then
local vvel = v:getvelocity() or v:get_player_velocity()
local veldif = self.object:getvelocity()
if vvel then
veldif = vector.subtract(veldif, vvel)
end
local gain = vector.length(veldif)/20
v:punch(
(self.thrower and minetest.get_player_by_name(self.thrower))
or self.object,
1,
{full_punch_interval=1, damage_groups = {fleshy=math.ceil(gain)}}
)
minetest.sound_play("NinjaStarHit", {pos=pos, gain=gain})
spawn_falling_node(pos, {name = "ninjastarmod:ItemNinjaStar_wood"})
self.object:remove()
return
end
end
end
end
minetest.register_entity("ninjastarmod:EntityNinjaStar_wood", EntityNinjaStar_wood)

View File

@ -1,16 +1,18 @@
--This mod was made with the help of throwing mod : https://github.com/minetest-mods/throwing
-- ninjastarmod (ninjastarmod 1.0.0.0)
-- Made by: jtrent238
-- Definitions made by this mod that other mods can use too
ninjastarmod = {}
ninjastarmod.stars = {"ItemNinjaStar_wood", "ItemNinjaStar_stone", "ItemNinjaStar_iron", "ItemNinjaStar_gold", "ItemNinjaStar_mese", "ItemNinjaStar_diamond"}
ninjastarmod.target_object = 1
ninjastarmod.target_node = 2
ninjastarmod.target_both = 3
ninjastarmod.modname = minetest.get_current_modname()
-- Load other files
--dofile(minetest.get_modpath("ninjastarmod").."/EntityNinjaStar_wood.lua")
--dofile(minetest.get_modpath("ninjastarmod").."/ItemNinjaStar_stone.lua")
--dofile(minetest.get_modpath("ninjastarmod").."/ItemNinjaStar_iron.lua")
--dofile(minetest.get_modpath("ninjastarmod").."/ItemNinjaStar_gold.lua")
--dofile(minetest.get_modpath("ninjastarmod").."/ItemNinjaStar_mese.lua")
--dofile(minetest.get_modpath("ninjastarmod").."/ItemNinjaStar_diamond.lua")
-- Set a noticeable inventory formspec for players
minetest.register_on_joinplayer(function(player)
local cb = function(player)
@ -19,92 +21,17 @@ minetest.register_on_joinplayer(function(player)
minetest.after(2.0, cb, player)
end)
function ninjastarmod.is_star(itemstack)
for _, arrow in ipairs(ninjastarmod.stars) do
if (type(itemstack) == "string" and itemstack or itemstack:get_name()) == star then
return true
end
end
return false
-- Add NinjaStars to treasurer API
if minetest.get_modpath("treasurer") then
treasurer.register_treasure("ninjastarmod:ItemNinjaStar_wood",0.1,2,{3,6})
treasurer.register_treasure("ninjastarmod:ItemNinjaStar_stone",0.1,2,{3,6})
treasurer.register_treasure("ninjastarmod:ItemNinjaStar_iron",0.1,2,{3,6})
treasurer.register_treasure("ninjastarmod:ItemNinjaStar_gold",0.1,2,{3,6})
treasurer.register_treasure("ninjastarmod:ItemNinjaStar_mese",0.1,2,{3,6})
treasurer.register_treasure("ninjastarmod:ItemNinjaStar_diamond",0.1,2,{3,6})
end
local function throw_star(itemstack, player, index, throw_itself, new_stack)
local inventory = player:get_inventory()
if not throw_itself then
if index >= player:get_inventory():get_size("main") then
return false
end
index = index + 1
end
local star_stack = inventory:get_stack("main", index)
local star = star_stack:get_name()
local playerpos = player:getpos()
local pos = {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}
local obj = (minetest.registered_items[itemstack:get_name()].spawn_ninjastar or ninjastarmod.spawn_ninjastar)(pos, arrow, player)
local luanetity = obj:get_luaentity()
luanetity.player = player:get_player_name()
if not luanetity.item then
luanetity.item = star
end
if luanetity.on_throw then
if luanetity:on_throw(pos, player, star_stack, index, luanetity.data) == false then
obj:remove()
return false
end
end
local dir = player:get_look_dir()
local velocity_factor = tonumber(minetest.settings:get("ninjastarmod.velocity_factor")) or 19
local horizontal_acceleration_factor = tonumber(minetest.settings:get("ninjastarmod.horizontal_acceleration_factor")) or -3
local vertical_acceleration = tonumber(minetest.settings:get("ninjastarmod.vertical_acceleration")) or -10
obj:setvelocity({x=dir.x*velocity_factor, y=dir.y*velocity_factor, z=dir.z*velocity_factor})
obj:setacceleration({x=dir.x*horizontal_acceleration_factor, y=vertical_acceleration, z=dir.z*horizontal_acceleration_factor})
obj:setyaw(player:get_look_horizontal()-math.pi/2)
if luanetity.on_throw_sound ~= "" then
minetest.sound_play(luanetity.on_throw_sound or "NinjaStarHit", {pos=playerpos, gain = 0.5})
end
if not minetest.settings:get_bool("creative_mode") then
if new_stack then
inventory:set_stack("main", index, new_stack)
else
local stack = inventory:get_stack("main", index)
stack:take_item()
inventory:set_stack("main", index, stack)
end
end
return true
end
function ninjastarmod.make_star_def(def)
def.timer = 0
def.player = ""
def.on_step = star_step
def.data = {}
return def
end
function ninjastarmod.spawn_ninjastar(pos, start, player)
if ninjastarmod.is_ninjastar(star) then
return minetest.add_entity(pos, star.."_entity")
elseif minetest.registered_items[star].throwing_entity then
if type(minetest.registered_items[star].throwing_entity) == string then
return minetest.add_entity(pos, minetest.registered_items[star].throwing_entity)
else -- Type is a function
return minetest.registered_items[star].throwing_entity(pos, player)
end
else
obj = minetest.add_entity(pos, "_builtin:item", star)
end
end
-- ITEMS
@ -114,6 +41,8 @@ minetest.register_craftitem('ninjastarmod:ItemNinjaStar_wood', {
stack_max = 64,
})
minetest.register_entity(":__builtin:item", EntityNinjaStar)
minetest.register_craftitem('ninjastarmod:ItemNinjaStar_stone', {
description = 'Stone Ninja Star',
inventory_image = 'ItemNinjaStar_stone.png',
@ -143,3 +72,95 @@ minetest.register_craftitem('ninjastarmod:ItemNinjaStar_mese', {
inventory_image = 'ItemNinjaStar_mese.png',
stack_max = 64,
})
-- CRAFTS
minetest.register_craft({
output = 'ninjastarmod:ItemNinjaStar_wood',
recipe = {
{'','default:acacia_wood',''},
{'default:acacia_wood', '', 'default:acacia_wood'},
{'', 'default:acacia_wood', ''},
}
})
minetest.register_craft({
output = 'ninjastarmod:ItemNinjaStar_wood',
recipe = {
{'','default:aspen_wood',''},
{'default:aspen_wood', '', 'default:aspen_wood'},
{'', 'default:aspen_wood', ''},
}
})
minetest.register_craft({
output = 'ninjastarmod:ItemNinjaStar_wood',
recipe = {
{'','default:pine_wood',''},
{'default:pine_wood', '', 'default:pine_wood'},
{'', 'default:pine_wood', ''},
}
})
minetest.register_craft({
output = 'ninjastarmod:ItemNinjaStar_wood',
recipe = {
{'','default:wood',''},
{'default:wood', '', 'default:wood'},
{'', 'default:wood', ''},
}
})
minetest.register_craft({
output = 'ninjastarmod:ItemNinjaStar_stone',
recipe = {
{'','default:stone',''},
{'default:stone', '', 'default:stone'},
{'', 'default:stone', ''},
}
})
minetest.register_craft({
output = 'ninjastarmod:ItemNinjaStar_iron',
recipe = {
{'','default:ingot_iron',''},
{'default:ingot_iron', '', 'default:ingot_lump'},
{'', 'default:ingot_iron', ''},
}
})
minetest.register_craft({
output = 'ninjastarmod:ItemNinjaStar_iron',
recipe = {
{'','default:iron_lump',''},
{'default:iron_lump', '', 'default:iron_lump'},
{'', 'default:iron_lump', ''},
}
})
minetest.register_craft({
output = 'ninjastarmod:ItemNinjaStar_gold',
recipe = {
{'','default:gold_ingot',''},
{'default:gold_ingot', '', 'default:gold_ingot'},
{'', 'default:gold_ingot', ''},
}
})
minetest.register_craft({
output = 'ninjastarmod:ItemNinjaStar_mese',
recipe = {
{'','default:mese_crystal',''},
{'default:mese_crystal', '', 'default:mese_crystal'},
{'', 'default:mese_crystal', ''},
}
})
minetest.register_craft({
output = 'ninjastarmod:ItemNinjaStar_diamond',
recipe = {
{'','default:diamond',''},
{'default:diamond', '', 'default:diamond'},
{'', 'default:diamond', ''},
}
})