Various Updates
parent
fd6e41d847
commit
a2f84887cf
|
@ -18,18 +18,6 @@ minetest.register_craftitem("adv_lightsabers:kyber_crystal", { -- Uncolored Ligh
|
|||
description = "Kyber Crystal",
|
||||
inventory_image = "adv_lightsabers_kyber_crystal.png",
|
||||
stack_max = 1,
|
||||
on_use = function(itemstack,user,pointed_thing)
|
||||
if math.random(1,3) == 1 then
|
||||
itemstack:replace("adv_lightsabers:kyber_crystal_red")
|
||||
return itemstack
|
||||
elseif math.random(1,3) == 1 then
|
||||
itemstack:replace("adv_lightsabers:kyber_crystal_green")
|
||||
return itemstack
|
||||
else
|
||||
itemstack:replace("adv_lightsabers:kyber_crystal_blue")
|
||||
return itemstack
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
for n,color in ipairs(colors) do
|
||||
|
|
|
@ -0,0 +1,276 @@
|
|||
--------------------------
|
||||
-- Advanced Lightsabers --
|
||||
--------------------------
|
||||
-------- Ver 1.0 ---------
|
||||
|
||||
force_ability = {}
|
||||
ability_cooldown = {}
|
||||
|
||||
minetest.register_privilege("force_abilities", {
|
||||
description = "Allows player touse Force Abilities",
|
||||
give_to_singleplayer = false
|
||||
})
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
ability_cooldown[player:get_player_name()] = 0.0
|
||||
force_ability[player:get_player_name()] = {}
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
ability_cooldown[player:get_player_name()] = nil
|
||||
force_ability[player:get_player_name()] = nil
|
||||
end)
|
||||
|
||||
-------------------
|
||||
-- Menu Formspec --
|
||||
-------------------
|
||||
|
||||
function adv_lightsabers.force_menu_form(player)
|
||||
local formspec = {
|
||||
"size[6,3.476]",
|
||||
"real_coordinates[true]",
|
||||
"button[0.5,2.3;1.6,0.8;jump;Force Jump]",
|
||||
"button[2.25,2.3;1.6,0.8;throw;Saber Throw]",
|
||||
"button[4,2.3;1.6,0.8;push;Force Push]",
|
||||
"button[0.5,1.3;1.6,0.8;choke;Force Choke]",
|
||||
"button[2.25,1.3;1.6,0.8;bond;Crystal Bond]",
|
||||
"button[4,1.3;1.6,0.8;dash;Force Dash]",
|
||||
"button[0.5,0.3;1.6,0.8;heal;Force Heal]",
|
||||
"button[2.25,0.3;1.6,0.8;bleed;Crystal Bleed]",
|
||||
"button[4,0.3;1.6,0.8;stun;Force Stun]"
|
||||
}
|
||||
return table.concat(formspec, "")
|
||||
end
|
||||
|
||||
function adv_lightsabers.show_force_menu(player)
|
||||
minetest.show_formspec(player, "adv_lightsabers:force_menu", adv_lightsabers.force_menu_form(player))
|
||||
end
|
||||
|
||||
--------------------------------------
|
||||
-- Use raycast to get pointed_thing --
|
||||
--------------------------------------
|
||||
|
||||
local function ray_pointed_thing(player)
|
||||
local dir = player:get_look_dir()
|
||||
local pos = player:get_pos()
|
||||
pos.y = pos.y + player:get_properties().eye_height or 1.625
|
||||
local dest = vector.add(pos, vector.multiply(dir, 20))
|
||||
local ray = minetest.raycast(pos, dest, true, false)
|
||||
for pointed_thing in ray do
|
||||
if pointed_thing.type == "object" then
|
||||
local pointedobject = pointed_thing.ref
|
||||
if pointedobject:is_player() and pointedobject:get_player_name() == player:get_player_name() then
|
||||
pointedobject = nil
|
||||
else
|
||||
return pointedobject
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---------------------
|
||||
-- Force Abilities --
|
||||
---------------------
|
||||
|
||||
function force_jump(player) -- Heightened Jump
|
||||
local playername = player:get_player_name()
|
||||
local cooldown = ability_cooldown[playername]
|
||||
local ability = force_ability[playername]
|
||||
if player:get_player_control().sneak == true and player:get_player_control().jump == true then
|
||||
player:add_player_velocity({x=0,y=8,z=0})
|
||||
ability_cooldown[playername] = 5
|
||||
minetest.after(ability_cooldown[playername],function(playername)
|
||||
ability_cooldown[playername] = 0.0
|
||||
end, playername)
|
||||
end
|
||||
end
|
||||
|
||||
function force_push(player) -- Push entities a far distance
|
||||
local playername = player:get_player_name()
|
||||
local cooldown = ability_cooldown[playername]
|
||||
local ability = force_ability[playername]
|
||||
local pointedobject = ray_pointed_thing(player)
|
||||
if player:get_player_control().sneak == true and player:get_player_control().LMB == true then
|
||||
if pointedobject and pointedobject:is_player() then
|
||||
local dir = player:get_look_dir()
|
||||
pointedobject:add_player_velocity(vector.multiply(dir,25))
|
||||
ability_cooldown[playername] = 5
|
||||
minetest.after(ability_cooldown[playername],function(playername)
|
||||
ability_cooldown[playername] = 0.0
|
||||
end, playername)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function force_choke(player) -- Lift a Player off the ground and slowly choke them
|
||||
local playername = player:get_player_name()
|
||||
local cooldown = ability_cooldown[playername]
|
||||
local ability = force_ability[playername]
|
||||
local pointedobject = ray_pointed_thing(player)
|
||||
if player:get_player_control().sneak == true and player:get_player_control().LMB == true then
|
||||
if pointedobject and pointedobject:is_player() then
|
||||
pointedobject:add_player_velocity({x=0,y=5,z=0})
|
||||
pointedobject:set_physics_override(0.1,0.1,0.1,false,false,false)
|
||||
pointedobject:punch(player,1.0,{full_punch_interval = 0.1,damage_groups = {fleshy = 1}},nil)
|
||||
minetest.after(1,function()
|
||||
pointedobject:punch(player,1.0,{full_punch_interval = 0.1,damage_groups = {fleshy = 1}},nil)
|
||||
end)
|
||||
minetest.after(2,function()
|
||||
pointedobject:punch(player,1.0,{full_punch_interval = 0.1,damage_groups = {fleshy = 1}},nil)
|
||||
end)
|
||||
minetest.after(3,function()
|
||||
pointedobject:punch(player,1.0,{full_punch_interval = 0.1,damage_groups = {fleshy = 1}},nil)
|
||||
end)
|
||||
minetest.after(7.5,function()
|
||||
pointedobject:set_physics_override(1.0,1.0,1.0,true,true,false)
|
||||
end)
|
||||
ability_cooldown[playername] = 5
|
||||
minetest.after(ability_cooldown[playername],function(playername)
|
||||
ability_cooldown[playername] = 0.0
|
||||
end, playername)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function force_dash(player) -- Give yourself a short but quick burst of speed
|
||||
local playername = player:get_player_name()
|
||||
local cooldown = ability_cooldown[playername]
|
||||
local ability = force_ability[playername]
|
||||
local pointedobject = ray_pointed_thing(player)
|
||||
if player:get_player_control().sneak == true and player:get_player_control().up == true and player:get_player_control().down == true then
|
||||
local dir = player:get_look_dir()
|
||||
dir.y = dir.y * 0.1
|
||||
player:add_player_velocity(vector.multiply(dir,25))
|
||||
ability_cooldown[playername] = 5
|
||||
minetest.after(ability_cooldown[playername],function(playername)
|
||||
ability_cooldown[playername] = 0.0
|
||||
end, playername)
|
||||
end
|
||||
end
|
||||
|
||||
function force_heal(player) -- Heal yourself by 4 hearts
|
||||
local playername = player:get_player_name()
|
||||
local cooldown = ability_cooldown[playername]
|
||||
local ability = force_ability[playername]
|
||||
local pointedobject = ray_pointed_thing(player)
|
||||
if player:get_player_control().sneak == true and player:get_player_control().RMB then
|
||||
local hp = player:get_hp()
|
||||
player:set_hp(hp + 8)
|
||||
ability_cooldown[playername] = 5
|
||||
minetest.after(ability_cooldown[playername],function(playername)
|
||||
ability_cooldown[playername] = 0.0
|
||||
end, playername)
|
||||
end
|
||||
end
|
||||
|
||||
function force_stun(player) -- Freeze Players in place for 5 seconds
|
||||
local playername = player:get_player_name()
|
||||
local cooldown = ability_cooldown[playername]
|
||||
local ability = force_ability[playername]
|
||||
local pointedobject = ray_pointed_thing(player)
|
||||
if player:get_player_control().sneak == true and player:get_player_control().LMB == true then
|
||||
if pointedobject and pointedobject:is_player() then
|
||||
pointedobject:set_physics_override(-0.01,-0.01,-0.01,false,false,false)
|
||||
minetest.after(5,function()
|
||||
pointedobject:set_physics_override(1.0,1.0,1.0,true,true,false)
|
||||
end)
|
||||
ability_cooldown[playername] = 5
|
||||
minetest.after(ability_cooldown[playername],function(playername)
|
||||
ability_cooldown[playername] = 0.0
|
||||
end, playername)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
----------
|
||||
-- Menu --
|
||||
----------
|
||||
|
||||
function adv_lightsabers.force_menu()
|
||||
for _,player in ipairs(minetest.get_connected_players()) do
|
||||
if minetest.check_player_privs(player:get_player_name(), {force_abilities = true}) then
|
||||
local playername = player:get_player_name()
|
||||
local cooldown = ability_cooldown[playername]
|
||||
local ability = force_ability[playername]
|
||||
if player:get_player_control().LMB == true and player:get_player_control().up == true and player:get_player_control().down == true then
|
||||
adv_lightsabers.show_force_menu(player:get_player_name())
|
||||
end
|
||||
if ability == "force_jump" and cooldown == 0.0 then
|
||||
force_jump(player)
|
||||
elseif ability == "force_push" and cooldown == 0.0 then
|
||||
force_push(player)
|
||||
elseif ability == "force_choke" and cooldown == 0.0 then
|
||||
force_choke(player)
|
||||
elseif ability == "force_dash" and cooldown == 0.0 then
|
||||
force_dash(player)
|
||||
elseif ability == "force_heal" and cooldown == 0.0 then
|
||||
force_heal(player)
|
||||
elseif ability == "force_stun" and cooldown == 0.0 then
|
||||
force_stun(player)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if formname ~= "adv_lightsabers:force_menu" then
|
||||
return
|
||||
end
|
||||
if fields.jump then
|
||||
local playername = player:get_player_name()
|
||||
force_ability[playername] = "force_jump"
|
||||
minetest.chat_send_player(playername,"Force Ability:Force Jump")
|
||||
end
|
||||
if fields.throw then
|
||||
local playername = player:get_player_name()
|
||||
force_ability[playername] = "saber_throw"
|
||||
minetest.chat_send_player(playername,"Force Ability:Saber Throw")
|
||||
end
|
||||
if fields.push then
|
||||
local playername = player:get_player_name()
|
||||
force_ability[playername] = "force_push"
|
||||
minetest.chat_send_player(playername,"Force Ability:Force Push")
|
||||
end
|
||||
if fields.choke then
|
||||
local playername = player:get_player_name()
|
||||
force_ability[playername] = "force_choke"
|
||||
minetest.chat_send_player(playername,"Force Ability:Force Choke")
|
||||
end
|
||||
if fields.bond then
|
||||
local playername = player:get_player_name()
|
||||
if player:get_wielded_item():get_name() == "adv_lightsabers:kyber_crystal" then
|
||||
minetest.chat_send_player(playername,"You have bonded with your Kyber Crystal")
|
||||
if math.random(1,2) == 1 then
|
||||
player:set_wielded_item("adv_lightsabers:kyber_crystal_blue")
|
||||
else
|
||||
player:set_wielded_item("adv_lightsabers:kyber_crystal_green")
|
||||
end
|
||||
end
|
||||
end
|
||||
if fields.dash then
|
||||
local playername = player:get_player_name()
|
||||
force_ability[playername] = "force_dash"
|
||||
minetest.chat_send_player(playername,"Force Ability:Force Dash")
|
||||
end
|
||||
if fields.heal then
|
||||
local playername = player:get_player_name()
|
||||
force_ability[playername] = "force_heal"
|
||||
minetest.chat_send_player(playername,"Force Ability:Force Heal")
|
||||
end
|
||||
if fields.bleed then
|
||||
local playername = player:get_player_name()
|
||||
if player:get_wielded_item():get_name() == "adv_lightsabers:kyber_crystal_blue" or player:get_wielded_item():get_name() == "adv_lightsabers:kyber_crystal_green" then
|
||||
minetest.chat_send_player(playername,"You have bled your Kyber Crystal")
|
||||
player:set_wielded_item("adv_lightsabers:kyber_crystal_red")
|
||||
end
|
||||
end
|
||||
if fields.stun then
|
||||
local playername = player:get_player_name()
|
||||
force_ability[playername] = "force_stun"
|
||||
minetest.chat_send_player(playername,"Force Ability:Force Stun")
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
adv_lightsabers.force_menu()
|
||||
end)
|
2
init.lua
2
init.lua
|
@ -8,8 +8,10 @@ adv_lightsabers = {}
|
|||
local modname = "adv_lightsabers"
|
||||
local modpath = minetest.get_modpath(modname)
|
||||
|
||||
assert(loadfile(modpath .. "/force_api.lua"))(modpath, modname)
|
||||
assert(loadfile(modpath .. "/register_lightsabers.lua"))(modpath, modname)
|
||||
assert(loadfile(modpath .. "/lightsabers.lua"))(modpath, modname)
|
||||
assert(loadfile(modpath .. "/craftitems.lua"))(modpath, modname)
|
||||
assert(loadfile(modpath .. "/ores.lua"))(modpath, modname)
|
||||
|
||||
|
||||
|
|
|
@ -26,35 +26,6 @@ function adv_lightsabers.lightsaber_attack(player,pointed_thing,swing,clash)
|
|||
end
|
||||
end
|
||||
|
||||
function adv_lightsabers.force_push(player,pointed_thing)
|
||||
if not pointed_thing then return end
|
||||
if pointed_thing.type == "object" and pointed_thing.ref:is_player() then
|
||||
local dir = player:get_look_dir()
|
||||
dir.y = 0.5
|
||||
pointed_thing.ref:add_player_velocity(vector.multiply(dir,20))
|
||||
end
|
||||
end
|
||||
|
||||
function adv_lightsabers.force_jump(player)
|
||||
player:add_player_velocity({x=0,y=12,z=0})
|
||||
end
|
||||
|
||||
function adv_lightsabers.force_dash(player)
|
||||
local dir = player:get_look_dir()
|
||||
dir.y = dir.y * 0.1
|
||||
player:add_player_velocity(vector.multiply(dir,25))
|
||||
end
|
||||
|
||||
function adv_lightsabers.do_abilities(color,player,pointed_thing)
|
||||
if color == "red" then
|
||||
adv_lightsabers.force_dash(player,pointed_thing)
|
||||
elseif color == "green" then
|
||||
adv_lightsabers.force_jump(player)
|
||||
elseif color == "blue" then
|
||||
adv_lightsabers.force_push(player,pointed_thing)
|
||||
end
|
||||
end
|
||||
|
||||
function adv_lightsabers:register_lightsaber_entity(type,color)
|
||||
|
||||
local function is_owner_at_pos(self,pos) -- Check if Lightsaber owner is at current position
|
||||
|
@ -127,7 +98,7 @@ function adv_lightsabers:register_lightsaber_entity(type,color)
|
|||
visual_size = {x=.25,y=.25,z=.25},
|
||||
textures = {"adv_lightsabers:lightsaber_"..type.."_"..color.."_on"},
|
||||
collisionbox = {-0.125,-0.125,-0.125,0.125,0.125,0.125},
|
||||
glow = 10,
|
||||
glow = 10,
|
||||
owner = owner,
|
||||
timer = 0,
|
||||
on_activate = function(self)
|
||||
|
@ -175,38 +146,21 @@ end
|
|||
|
||||
function adv_lightsabers:register_lightsaber(type,color)
|
||||
|
||||
|
||||
local ability_cooldown = {}
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
ability_cooldown[player:get_player_name()] = 0.0
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
ability_cooldown[player:get_player_name()] = nil
|
||||
end)
|
||||
|
||||
-- Single Blade Lightsaber
|
||||
|
||||
if type == "single" then
|
||||
|
||||
adv_lightsabers:register_lightsaber_entity(type,color)
|
||||
|
||||
minetest.register_craftitem("adv_lightsabers:lightsaber_single_"..color.."_off", {
|
||||
description = "Lightsaber",
|
||||
inventory_image = "adv_lightsabers_hilt_single_inv.png",
|
||||
stack_max = 1,
|
||||
on_use = function(itemstack,player,pointed_thing)
|
||||
local playername = player:get_player_name()
|
||||
if player:get_player_control().sneak == true and ability_cooldown[player:get_player_name()] == 0 then
|
||||
adv_lightsabers.do_abilities(color,player,pointed_thing)
|
||||
ability_cooldown[playername] = 5
|
||||
minetest.after(ability_cooldown[playername],function(playername)
|
||||
ability_cooldown[playername] = 0.0
|
||||
end, playername)
|
||||
else
|
||||
local activate = "adv_lightsabers_activate"
|
||||
itemstack:replace("adv_lightsabers:lightsaber_single_"..color.."_on")
|
||||
adv_lightsabers.play_sound(player,activate)
|
||||
return itemstack
|
||||
end
|
||||
local activate = "adv_lightsabers_activate"
|
||||
itemstack:replace("adv_lightsabers:lightsaber_single_"..color.."_on")
|
||||
adv_lightsabers.play_sound(player,activate)
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
|
@ -222,10 +176,22 @@ function adv_lightsabers:register_lightsaber(type,color)
|
|||
adv_lightsabers.lightsaber_attack(player,pointed_thing,swing,clash)
|
||||
end,
|
||||
on_secondary_use = function(itemstack,player,pointed_thing)
|
||||
local deactivate = "adv_lightsabers_deactivate"
|
||||
itemstack:replace("adv_lightsabers:lightsaber_single_"..color.."_off")
|
||||
adv_lightsabers.play_sound(player,deactivate)
|
||||
return itemstack
|
||||
if player:get_player_control().sneak == true then
|
||||
local playername = player:get_player_name()
|
||||
if force_ability[playername] == "saber_throw" then
|
||||
adv_lightsabers:saber_throw(itemstack,player,type,color)
|
||||
ability_cooldown[playername] = 5
|
||||
minetest.after(ability_cooldown[playername],function(playername)
|
||||
ability_cooldown[playername] = 0.0
|
||||
end, playername)
|
||||
return itemstack
|
||||
end
|
||||
else
|
||||
local deactivate = "adv_lightsabers_deactivate"
|
||||
itemstack:replace("adv_lightsabers:lightsaber_single_"..color.."_off")
|
||||
adv_lightsabers.play_sound(player,deactivate)
|
||||
return itemstack
|
||||
end
|
||||
end,
|
||||
on_place = function(itemstack,player,pointed_thing)
|
||||
local deactivate = "adv_lightsabers_deactivate"
|
||||
|
@ -240,6 +206,9 @@ function adv_lightsabers:register_lightsaber(type,color)
|
|||
-- Crossguarded Lightsaber
|
||||
|
||||
if type == "cross" then
|
||||
|
||||
adv_lightsabers:register_lightsaber_entity(type,color)
|
||||
|
||||
minetest.register_craftitem("adv_lightsabers:lightsaber_cross_"..color.."_off", {
|
||||
description = "Crossguarded Lightsaber",
|
||||
inventory_image = "adv_lightsabers_hilt_cross_inv.png",
|
||||
|
@ -264,10 +233,22 @@ function adv_lightsabers:register_lightsaber(type,color)
|
|||
adv_lightsabers.lightsaber_attack(player,pointed_thing,swing,clash)
|
||||
end,
|
||||
on_secondary_use = function(itemstack,player,pointed_thing)
|
||||
local deactivate = "adv_lightsabers_deactivate_cross"
|
||||
itemstack:replace("adv_lightsabers:lightsaber_cross_"..color.."_off")
|
||||
adv_lightsabers.play_sound(player,deactivate)
|
||||
return itemstack
|
||||
if player:get_player_control().sneak == true then
|
||||
local playername = player:get_player_name()
|
||||
if force_ability[playername] == "saber_throw" then
|
||||
adv_lightsabers:saber_throw(itemstack,player,type,color)
|
||||
ability_cooldown[playername] = 5
|
||||
minetest.after(ability_cooldown[playername],function(playername)
|
||||
ability_cooldown[playername] = 0.0
|
||||
end, playername)
|
||||
return itemstack
|
||||
end
|
||||
else
|
||||
local deactivate = "adv_lightsabers_deactivate_cross"
|
||||
itemstack:replace("adv_lightsabers:lightsaber_cross_"..color.."_off")
|
||||
adv_lightsabers.play_sound(player,deactivate)
|
||||
return itemstack
|
||||
end
|
||||
end,
|
||||
on_place = function(itemstack,player,pointed_thing)
|
||||
local deactivate = "adv_lightsabers_deactivate_cross"
|
||||
|
@ -310,8 +291,15 @@ function adv_lightsabers:register_lightsaber(type,color)
|
|||
end,
|
||||
on_secondary_use = function(itemstack,player,pointed_thing)
|
||||
if player:get_player_control().sneak == true then
|
||||
adv_lightsabers:saber_throw(itemstack,player,"double",color)
|
||||
return itemstack
|
||||
local playername = player:get_player_name()
|
||||
if force_ability[playername] == "saber_throw" then
|
||||
adv_lightsabers:saber_throw(itemstack,player,type,color)
|
||||
ability_cooldown[playername] = 5
|
||||
minetest.after(ability_cooldown[playername],function(playername)
|
||||
ability_cooldown[playername] = 0.0
|
||||
end, playername)
|
||||
return itemstack
|
||||
end
|
||||
else
|
||||
local deactivate = "adv_lightsabers_deactivate"
|
||||
itemstack:replace("adv_lightsabers:lightsaber_double_"..color.."_off")
|
||||
|
@ -328,4 +316,4 @@ function adv_lightsabers:register_lightsaber(type,color)
|
|||
groups = {not_in_creative_inventory=1,lightsaber=1},
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue