From ebbbc4feea4f908c3482e1415cb32516c6ad90c7 Mon Sep 17 00:00:00 2001 From: Grandolf Date: Sun, 11 Jun 2017 14:56:59 -0400 Subject: [PATCH] Create wizard.lua --- classes/wizard.lua | 344 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 344 insertions(+) diff --git a/classes/wizard.lua b/classes/wizard.lua index 8b13789..7fafe21 100644 --- a/classes/wizard.lua +++ b/classes/wizard.lua @@ -1 +1,345 @@ +minetest.register_entity("classes:fireball", { + textures = {"fireball.png"}, + velocity = 15, + light_source = 200, + on_step = function (self, pos, node, dtime) + local pos = self.object:getpos() + local objs = minetest.env:get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + obj:set_hp(obj:get_hp()-15) + if obj:is_player() then + return + else + obj:set_hp(obj:get_hp()-70) + if obj:get_entity_name() ~= "classes:fireball" then + if obj:get_hp()<=0 then + obj:remove() + end + self.object:remove() + end + end + end + for dx=-1,1 do + for dy=-1,1 do + for dz=-1,1 do + local p = {x=pos.x+dx, y=pos.y, z=pos.z+dz} + local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} + local n = minetest.env:get_node(p).name +-- if n ~= "classes:fireball" and n ~="hackersheep:hackersheep" and n ~="prohackersheep:prohackersheep" then +-- if minetest.registered_nodes[n].groups.noobhackersheep then --[[or math.random(1, 100) <= 0]] +-- minetest.env:set_node(t, {name=""..n}) +-- else +-- minetest.env:set_node(t, {name=""..n}) +-- end +-- else +if minetest.registered_nodes[n].groups.flammable or minetest.registered_nodes[n].groups.choppy or minetest.registered_nodes[n].groups.oddly_breakable_by_hand or minetest.registered_nodes[n].groups.cracky or minetest.registered_nodes[n].groups.crumbly or n =="default:desert_stone" then + self.hit_node(self, pos, node) + self.object:remove() + return + end + end + end + end + end, + + + hit_node = function(self, pos, node) + local pos = self.object:getpos() +-- for dx=-4,4 do +-- for dy=-4,4 do +-- for dz=-4,4 do +-- local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} +-- local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} +-- local n = minetest.env:get_node(pos).name +-- if math.random(1, 50) <= 0 then +-- minetest.env:remove_node(p) +-- end +-- if minetest.registered_nodes[n].groups.flammable or math.random(1, 100) >=500 then +-- minetest.env:set_node(t, {name="air"}) +-- end + local objects = minetest.env:get_objects_inside_radius(pos, 10) + for _,obj in ipairs(objects) do + if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then + local obj_p = obj:getpos() + local vec = {x=obj_p.x-pos.x, y=obj_p.y-pos.y, z=obj_p.z-pos.z} + local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5 + local damage = ((80*0.5^dist)*2)+3 + obj:punch(obj, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, vec) + end + end + + minetest.add_particlespawner( + 10, --amount + 0.1, --time + {x=pos.x-3, y=pos.y-3, z=pos.z-3}, --minpos + {x=pos.x+3, y=pos.y+3, z=pos.z+3}, --maxpos + {x=-0, y=-0, z=-0}, --minvel + {x=0, y=0, z=0}, --maxvel + {x=-0.5,y=5,z=-0.5}, --minacc + {x=0.5,y=5,z=0.5}, --maxacc + 0.1, --minexptime + 1, --maxexptime + 50, --minsize + 90, --maxsize + false, --collisiondetection + "flame_pillar.png" --texture + ) + +-- end +-- end +-- end + end +}) +minetest.register_craftitem("classes:firestaff", { + description = "Staff of Fire", + inventory_image = "firestaff.png", + wield_scale = {x=2.5,y=5.5,z=1.5}, + stackable = false, + on_use = function (itemstack, placer, pointed_thing) + local dir = placer:get_look_dir(); + local playerpos = placer:getpos(); + local obj = minetest.env:add_entity({x=playerpos.x+0+dir.x,y=playerpos.y+2+dir.y,z=playerpos.z+0+dir.z}, "classes:fireball") + local vec = {x=dir.x*6,y=dir.y*6,z=dir.z*6} + obj:setvelocity(vec) + return itemstack + end, + light_source = 15, +}) +local addvectors = function (v1, v2) + return {x=v1.x+v2.x, y=v1.y+v2.y, z=v1.z+v2.z} +end + +minetest.register_entity("classes:magicmissile", { + textures = {"magicmissile.png"}, + velocity = 15, + light_source = 200, + on_step = function (self, pos, node, dtime) + local pos = self.object:getpos() + local objs = minetest.env:get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + obj:set_hp(obj:get_hp()-5) + if obj:is_player() then + return + else + obj:set_hp(obj:get_hp()-10) + if obj:get_entity_name() ~= "classes:magicmissile" then + if obj:get_hp()<=0 then + obj:remove() + end + self.object:remove() + end + end + end + + for dx=-1,1 do + for dy=-1,1 do + for dz=-1,1 do + local p = {x=pos.x+dx, y=pos.y, z=pos.z+dz} + local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} + local n = minetest.env:get_node(p).name +-- if n ~= "classes:fireball" and n ~="hackersheep:hackersheep" and n ~="prohackersheep:prohackersheep" then +-- if minetest.registered_nodes[n].groups.noobhackersheep then --[[or math.random(1, 100) <= 0]] +-- minetest.env:set_node(t, {name=""..n}) +-- else +-- minetest.env:set_node(t, {name=""..n}) +-- end +-- else +if minetest.registered_nodes[n].groups.flammable or minetest.registered_nodes[n].groups.choppy or minetest.registered_nodes[n].groups.oddly_breakable_by_hand or minetest.registered_nodes[n].groups.cracky or minetest.registered_nodes[n].groups.crumbly or n =="default:desert_stone" then + self.hit_node(self, pos, node) + self.object:remove() + return + end + end + end + end + end, + + + hit_node = function(self, pos, node) + local pos = self.object:getpos() +-- for dx=-4,4 do +-- for dy=-4,4 do +-- for dz=-4,4 do +-- local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} +-- local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} +-- local n = minetest.env:get_node(pos).name +-- if math.random(1, 50) <= 0 then +-- minetest.env:remove_node(p) +-- end +-- if minetest.registered_nodes[n].groups.flammable or math.random(1, 100) >=500 then +-- minetest.env:set_node(t, {name="air"}) +-- end + local objects = minetest.env:get_objects_inside_radius(pos, 2) + for _,obj in ipairs(objects) do + if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then + local obj_p = obj:getpos() + local vec = {x=obj_p.x-pos.x, y=obj_p.y-pos.y, z=obj_p.z-pos.z} + local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5 + local damage = (10*0.5^dist)*1 + obj:punch(obj, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, vec) + end + end + + minetest.add_particlespawner( + 2, --amount + 0.1, --time + {x=pos.x-3, y=pos.y-3, z=pos.z-3}, --minpos + {x=pos.x+3, y=pos.y+3, z=pos.z+3}, --maxpos + {x=-0, y=-0, z=-0}, --minvel + {x=0, y=0, z=0}, --maxvel + {x=-0.5,y=5,z=-0.5}, --minacc + {x=0.5,y=5,z=0.5}, --maxacc + 0.1, --minexptime + 1, --maxexptime + 50, --minsize + 90, --maxsize + false, --collisiondetection + "magicmissileburst.png" --texture + ) + +-- end +-- end +-- end + end +}) +minetest.register_craftitem("classes:apprentice_staff", { + description = "Staff of the Apprenti", + inventory_image = "apprentice.png", + wield_scale = {x=2.5,y=5.5,z=1.5}, + stackable = false, + on_use = function (itemstack, placer, pointed_thing) + local dir = placer:get_look_dir(); + local playerpos = placer:getpos(); + local obj = minetest.env:add_entity({x=playerpos.x+0+dir.x,y=playerpos.y+2+dir.y,z=playerpos.z+0+dir.z}, "classes:magicmissile") + local vec = {x=dir.x*8,y=dir.y*8,z=dir.z*8} + obj:setvelocity(vec) + return itemstack + end, + light_source = 15, +}) +local addvectors = function (v1, v2) + return {x=v1.x+v2.x, y=v1.y+v2.y, z=v1.z+v2.z} +end + + +minetest.register_entity("classes:lightning", { + textures = {"lightningball.png"}, + velocity = 15, + light_source = 200, + on_step = function (self, pos, node, dtime) + local pos = self.object:getpos() + local objs = minetest.env:get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + obj:set_hp(obj:get_hp()-10) + if obj:is_player() then + return + else + obj:set_hp(obj:get_hp()-20) + if obj:get_entity_name() ~= "classes:lightning" then + if obj:get_hp()<=0 then + obj:remove() + end + self.object:remove() + end + end + end + + for dx=-1,1 do + for dy=-1,1 do + for dz=-1,1 do + local p = {x=pos.x+dx, y=pos.y, z=pos.z+dz} + local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} + local n = minetest.env:get_node(p).name +-- if n ~= "classes:fireball" and n ~="hackersheep:hackersheep" and n ~="prohackersheep:prohackersheep" then +-- if minetest.registered_nodes[n].groups.noobhackersheep then --[[or math.random(1, 100) <= 0]] +-- minetest.env:set_node(t, {name=""..n}) +-- else +-- minetest.env:set_node(t, {name=""..n}) +-- end +-- else +if minetest.registered_nodes[n].groups.flammable or minetest.registered_nodes[n].groups.choppy or minetest.registered_nodes[n].groups.oddly_breakable_by_hand or minetest.registered_nodes[n].groups.cracky or minetest.registered_nodes[n].groups.crumbly or n =="default:desert_stone" then + self.hit_node(self, pos, node) + self.object:remove() + return + end + end + end + end + end, + + + hit_node = function(self, pos, node) + local pos = self.object:getpos() +-- for dx=-4,4 do +-- for dy=-4,4 do +-- for dz=-4,4 do +-- local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} +-- local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} +-- local n = minetest.env:get_node(pos).name +-- if math.random(1, 50) <= 0 then +-- minetest.env:remove_node(p) +-- end +-- if minetest.registered_nodes[n].groups.flammable or math.random(1, 100) >=500 then +-- minetest.env:set_node(t, {name="air"}) +-- end + local objects = minetest.env:get_objects_inside_radius(pos, 4) + for _,obj in ipairs(objects) do + if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then + local obj_p = obj:getpos() + local vec = {x=obj_p.x-pos.x, y=obj_p.y-pos.y, z=obj_p.z-pos.z} + local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5 + local damage = (80*0.5^dist)*2 + obj:punch(obj, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, vec) + end + end + + minetest.add_particlespawner( + 4, --amount + 0.1, --time + {x=pos.x-3, y=pos.y-3, z=pos.z-3}, --minpos + {x=pos.x+3, y=pos.y+3, z=pos.z+3}, --maxpos + {x=-0, y=-0, z=-0}, --minvel + {x=0, y=0, z=0}, --maxvel + {x=-0.0,y=0,z=-0.0}, --minacc + {x=0.1,y=-1,z=0.1}, --maxacc + 0.1, --minexptime + 1, --maxexptime + 300, --minsize + 350, --maxsize + false, --collisiondetection + "lightningbolt.png" --texture + ) + +-- end +-- end +-- end + end +}) +minetest.register_craftitem("classes:lightning_staff", { + description = "Staff of the Vengeful Skies", + inventory_image = "lightningstaff.png", + wield_scale = {x=2.5,y=5.5,z=1.5}, + stackable = false, + on_use = function (itemstack, placer, pointed_thing) + local dir = placer:get_look_dir(); + local playerpos = placer:getpos(); + local obj = minetest.env:add_entity({x=playerpos.x+0+dir.x,y=playerpos.y+2+dir.y,z=playerpos.z+0+dir.z}, "classes:lightning") + local vec = {x=dir.x*12,y=dir.y*12,z=dir.z*12} + obj:setvelocity(vec) + return itemstack + end, + light_source = 15, +}) +local addvectors = function (v1, v2) + return {x=v1.x+v2.x, y=v1.y+v2.y, z=v1.z+v2.z} +end