From 65f7492d52a79a59f00da03ed34d34238412b825 Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Wed, 12 Dec 2018 19:31:08 +0200 Subject: [PATCH] wands and wand focuses --- focuses.lua | 262 +++++++++++++++++++++- textures/magicalities_crystal_shard.png | Bin 295 -> 1229 bytes textures/magicalities_focus_atk_air.png | Bin 0 -> 1837 bytes textures/magicalities_focus_atk_earth.png | Bin 0 -> 2005 bytes textures/magicalities_focus_atk_fire.png | Bin 0 -> 2210 bytes textures/magicalities_focus_atk_water.png | Bin 0 -> 2156 bytes wands.lua | 41 +--- 7 files changed, 258 insertions(+), 45 deletions(-) create mode 100644 textures/magicalities_focus_atk_air.png create mode 100644 textures/magicalities_focus_atk_earth.png create mode 100644 textures/magicalities_focus_atk_fire.png create mode 100644 textures/magicalities_focus_atk_water.png diff --git a/focuses.lua b/focuses.lua index e4faee6..ad03a90 100644 --- a/focuses.lua +++ b/focuses.lua @@ -1,5 +1,12 @@ -- Wand Focuses +-- Constants +-- TODO: make settings +magicalities.magic_spray_count = 16 +magicalities.elemental_focus_velocity = 16 +magicalities.elemental_focus_consumption = 5 + +-- Teleportation minetest.register_craftitem("magicalities:focus_teleport", { description = "Wand Focus of Teleportation", groups = {wand_focus = 1}, @@ -40,6 +47,7 @@ minetest.register_craftitem("magicalities:focus_teleport", { end }) +-- Node swapper minetest.register_craftitem("magicalities:focus_swap", { description = "Wand Focus of Swapping", groups = {wand_focus = 1}, @@ -74,7 +82,7 @@ minetest.register_craftitem("magicalities:focus_swap", { return itemstack end - local drops = minetest.get_node_drops(pos) + local drops = minetest.get_node_drops(node.name) if ndef.can_dig ~= nil and not ndef.can_dig(pos, user) then return itemstack @@ -114,12 +122,15 @@ minetest.register_craftitem("magicalities:focus_swap", { end }) +--------------- +-- Tunneling -- +--------------- local tunneler_memory = {} local tunneler_depth = 8 local function reset_tunnel(tid) - local infos = tunneler_memory['t' .. tid] + local infos = tunneler_memory[tid] if not infos then return end local manip = minetest.get_voxel_manip() @@ -138,15 +149,13 @@ local function reset_tunnel(tid) manip:write_to_map() tunneler_memory['t' .. tid] = nil - - t = false end local function create_tunnel(pos, dir, owner) -- Ensure no double tunnels for id,data in pairs(tunneler_memory) do if data.owner == owner then - return + return false end end @@ -207,7 +216,7 @@ local function create_tunnel(pos, dir, owner) end end - if abort then return end + if abort then return false end -- Set nodes in map manip:set_data(data) @@ -226,7 +235,8 @@ local function create_tunnel(pos, dir, owner) owner = owner, } - minetest.after(10, reset_tunnel, cnum) + minetest.after(10, reset_tunnel, 't' .. cnum) + return true end minetest.register_node("magicalities:tunnel_node", { @@ -246,7 +256,9 @@ minetest.register_craftitem("magicalities:focus_tunnel", { inventory_image = "magicalities_focus_tunnel.png", stack_max = 1, _wand_requirements = { - ["air"] = 1 + ["dark"] = 10, + ["light"] = 10, + ["earth"] = 10, }, _wand_use = function (itemstack, user, pointed_thing) if not pointed_thing.above or pointed_thing.type ~= "node" then return itemstack end @@ -256,6 +268,12 @@ minetest.register_craftitem("magicalities:focus_tunnel", { dir = minetest.wallmounted_to_dir(wm) minetest.after(0.1, create_tunnel, pointed_thing.above, dir, user:get_player_name()) + itemstack = magicalities.wands.wand_take_contents(itemstack, { + ["dark"] = 10, + ["light"] = 10, + ["earth"] = 10, + }) + magicalities.wands.update_wand_desc(itemstack) return itemstack end @@ -266,3 +284,231 @@ minetest.register_on_shutdown(function () reset_tunnel(id) end end) + +----------------------- +-- Elemental Attacks -- +----------------------- + +local special_fn = {} + +-- Particles +local randparticles = PcgRandom(os.clock()) +local function shoot_particles (user, velocity, color) + if not color then + color = "" + else + color = "^[multiply:"..color + end + + -- Calculate velocity + local dir = user:get_look_dir() + local vel = {x=0,y=0,z=0} + vel.x = dir.x * velocity + vel.y = dir.y * velocity + vel.z = dir.z * velocity + + -- Calculate position + local pos = user:get_pos() + pos.x = pos.x + (dir.x * 2) + pos.y = pos.y + (dir.y * 2) + 1.5 + pos.z = pos.z + (dir.z * 2) + + for i = 1, magicalities.magic_spray_count do + -- Deviation + local relvel = {x=0,y=0,z=0} + relvel.x = vel.x + (randparticles:next((-i/2.5) * 1000, (i/2.5) * 1000) / 1000) + relvel.y = vel.y + (randparticles:next((-i/2.5) * 1000, (i/2.5) * 1000) / 1000) + relvel.z = vel.z + (randparticles:next((-i/2.5) * 1000, (i/2.5) * 1000) / 1000) + minetest.add_particle({ + pos = pos, + velocity = relvel, + acceleration = relvel, + expirationtime = 1, + size = 4, + collisiondetection = true, + collision_removal = true, + texture = "magicalities_spark.png"..color, + -- animation = {Tile Animation definition}, + glow = 2 + }) + end +end + +local function shoot_spray(user, dmg, vel, color, hit_fn) + shoot_particles(user, vel, color) + + minetest.after(0.05, function() + local pos = user:get_pos() + local dir = user:get_look_dir() + + local x = math.random(-1,1)*0.1 + local y = math.random(-1,1)*0.1 + local z = math.random(-1,1)*0.1 + local scatternum = math.random(2, magicalities.magic_spray_count / 2) + + for i = 1, scatternum do + local relvel = {x=0,y=0,z=0} + relvel.x = dir.x * vel + (randparticles:next((-i/2.5) * 1000, (i/2.5) * 1000) / 1000) + relvel.y = dir.y * vel + (randparticles:next((-i/2.5) * 1000, (i/2.5) * 1000) / 1000) + relvel.z = dir.z * vel + (randparticles:next((-i/2.5) * 1000, (i/2.5) * 1000) / 1000) + + local dmglow = dmg - math.floor(dmg / scatternum) + local reldmg = math.random(dmglow, dmg) + + local e=minetest.add_entity({x=pos.x+x,y=pos.y+1.5+y,z=pos.z+z}, "magicalities:magic_spray") + e:set_velocity(relvel) + e:set_yaw(user:get_look_yaw()+math.pi) + e:get_luaentity():set_dmg(reldmg) + e:get_luaentity():set_user(user) + if hit_fn then + e:get_luaentity():set_hit_function(hit_fn) + end + end + end) +end + +-- Attack +local on_hit_object = function(self, target, hp, user) + target:punch(user, 1, {full_punch_interval = 1, damage_groups = {fleshy = hp, magic = hp * 2}}, nil) + return self +end + +local magic_remove = function(self) + if self.object:get_attach() then self.object:set_detach() end + if self.target then self.target:punch(self.object, 1,{full_punch_interval=1,damage_groups={fleshy=4}}, nil) end + self.object:set_hp(0) + self.object:punch(self.object, 1,{full_punch_interval=1.0,damage_groups={fleshy=4}}, nil) + return self +end + +local magic_spray = { + initial_properties = { + hp_max = 1, + physical = false, + collide_with_objects = false, + collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3}, + visual = "sprite", + visual_size = {x = 0.4, y = 0.4}, + textures = {"[combine:16x16"}, + pointable = false, + }, + struck = false, + timer = 0, + hit_fn = nil, + on_step = function(self, dtime) + self.timer = self.timer + 1 + if self.timer > 80 or self.struck then + magic_remove(self) + end + local pos=self.object:get_pos() + local no=minetest.registered_nodes[minetest.get_node(pos).name] + if no.walkable and not self.struck then + if self.hit_fn and special_fn[self.hit_fn] and special_fn[self.hit_fn].on_hit_node then + special_fn[self.hit_fn].on_hit_node(self, pos, minetest.get_node(pos), self.user) + end + + self.struck = true + return self + end + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1)) do + if (ob and not self.struck) and ((ob:is_player() and ob:get_player_name() ~= self.user:get_player_name()) or (ob:get_luaentity() and ob:get_luaentity().physical and ob:get_luaentity().name~="__builtin:item" )) then + self.object:set_velocity({x=0, y=0, z=0}) + on_hit_object(self, ob, self.dmg / 2, self.user) + if self.hit_fn and special_fn[self.hit_fn] and special_fn[self.hit_fn].on_hit_object then + special_fn[self.hit_fn].on_hit_object(self, ob, self.dmg / 2, self.user) + end + + self.struck = true + return self + end + end + return self + end, + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir) + if not self.target then return self end + if not self.hp then self.hp = self.object:get_hp() end + local hp = self.object:get_hp() + local hurt = self.hp-self.object:get_hp() + self.hp = self.object:get_hp() + self.target:set_hp(self.target:get_hp() - hurt) + self.target:punch(self.object, hurt, {full_punch_interval = 1.0, damage_groups = {fleshy=4}}, "default:sword_wood", nil) + if hurt > 100 or hp <= hurt then + self.target:set_detach() + self.target:set_velocity({x=0, y=4, z=0}) + self.on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir) end + magic_remove(self) + end + return self + end +} + +function magic_spray:set_dmg(dmg) + self.dmg = dmg +end + +function magic_spray:set_user(user) + self.user = user +end + +function magic_spray:set_hit_function(hit_fn) + self.hit_fn = hit_fn +end + +function magicalities.register_elemental_focus (element, description, damage, hit_fn) + local el = magicalities.elements[element] + minetest.register_craftitem("magicalities:focus_atk_"..element, { + description = "Wand Focus of "..el.description.."\n"..description, + groups = {wand_focus = 1}, + inventory_image = "magicalities_focus_atk_"..element..".png", + stack_max = 1, + _wand_requirements = { + [element] = magicalities.elemental_focus_consumption + }, + _wand_use = function (itemstack, user, pointed_thing) + if not user or user:get_player_name() == "" then return itemstack end + + itemstack = magicalities.wands.wand_take_contents(itemstack, {[element] = magicalities.elemental_focus_consumption}) + magicalities.wands.update_wand_desc(itemstack) + shoot_spray(user, damage, magicalities.elemental_focus_velocity, el.color, hit_fn) + + return itemstack + end + }) +end + +function magicalities.register_focus_atk_special(name, fns) + special_fn[name] = fns +end + +-- Register everything + +minetest.register_entity("magicalities:magic_spray", magic_spray) + +magicalities.register_elemental_focus("air", "Deals some damage to enemies", 2) +magicalities.register_elemental_focus("earth", "Deals some damage to enemies", 4) +magicalities.register_elemental_focus("water", "Spawns water sources", 3, "setwater") +magicalities.register_elemental_focus("fire", "Lights things on fire", 8, "setfire") + +magicalities.register_focus_atk_special("setfire", { + on_hit_node = function (self, pos, node, user) + local toppos = vector.add(pos, {x=0,y=1,z=0}) + local topnode = minetest.get_node_or_nil(toppos) + if not topnode or topnode.name ~= "air" then return end + if minetest.is_protected(toppos, user:get_player_name()) then return end + minetest.set_node(toppos, {name="fire:basic_flame"}) + end +}) + +local function set_water(self, _, __, user) + local pos = self.object:get_pos() + local toppos = vector.add(pos, {x=0,y=1,z=0}) + local topnode = minetest.get_node_or_nil(toppos) + if not topnode or topnode.name ~= "air" then return end + if minetest.is_protected(toppos, user:get_player_name()) then return end + minetest.set_node(toppos, {name="default:water_source"}) +end + +magicalities.register_focus_atk_special("setwater", { + on_hit_object = set_water, + on_hit_node = set_water, +}) diff --git a/textures/magicalities_crystal_shard.png b/textures/magicalities_crystal_shard.png index bbba3dc56968010d061d75931a2fbe27bcd1d51d..056ddc4c13fa8a2f7072e8d738d277f05c185dd0 100644 GIT binary patch delta 1210 zcmV;r1V#I&0?i4KBYy*!dQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U1s8cI+q& zMgKL59s-hh4hQpCt7mYB-v^8xS1PxKb~}-m zBZ(`(5pe}l-UFEBnDTO@vLf64dE2*Te2U?^g|gQ7H9ymUKN_9YAl`Wn7QGb{f={@Q zVr)R(>JX}7#y3PS$v43Ak(@f|wp`Qr(bNtfI?!!)3q?6kvviE1?8~bL@5GOf0@bz9}?`_{* zwjNvdYg5No<{j2;BU|$=j~4LfOdQD`Eulpmi2|GzMYf?8PAovy*>dH~o!cA>7f7_y zBw!RNqFe~Z2pCDq#BE38Etba z8259;p)LnV5fnIxVFdx>Ssi;eL4*P`5*Yy~L%OJy4OrMYsSqhv)dLPr0b=8wz;mfM z+0FP60)K>4Pa41`X$CB79qK38h#JaHopsK67hH77Wv_mmFzA;geE zrl`?I7kvyd#uRgsr1;{xg!7nUN-1Xq&G4M@cE*C7H`#Qvo7?;rwz#D&7onoX7FT=; zC6-ijm8uozxcVAutf}V44W-m+ZoBKghaP*Po=<8E>s|W>HD1(Y zk{S!cNe$Kz4i`K=CvGqUF|iEbVGv*?k-^MFwpIqY!OSGVsc-_3ZosKLh=HJOEUxp( z?t`2o^*_Un078C(91V0&kh|yh6}6h@51mdz;~0*l8pY}BskfLV=J8AUaHM}*@a*`% zaDUWu_4C$?$M?UFA5l3~kqt56H z4Yln#LWTP0psGzrGTvX6oGA`cfN95dY?SGpReuw{MDUT}qm3pA}bX>njKTwY^e`^23 zj`06WqJIFH>f;cU8_bXZ000JJOGiWi0{|ER1gpFEegFUf32;bRa{vGf6951U69E94 zoEQKA00(qQO+^Rd3IY!e4lb+IbN~PV8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXn!C_ zNlj2!fese{005CmL_t(I%gxd~4#OY}hT+#y&%sqtMvLo~dgdxz#9jImL_)~adP0Kd zLpH##OJ)z=^TP!}#Bq00N&;}3!8x0+YXqQ_g2?yY}EnGk>qQ zxYmlQ$}qsp0EjUT@$M_Uuy1j#6*Hj2UBFe`1PrjK>fxZf8C=1KL!8BXKk?Jj4E~RL Y0vz8~0S4r3jQ{`u07*qoM6N<$g3whv7XSbN delta 242 zcmV!o`!2<~azYaOtc&`r^1QEyGDWwR&?Fg<_ zeOVF!tu<7?ZL(v zaB^>EX>4U6ba`-PAZ2)IW&i+q+O?N$lH({0hW~SlJpz&tAIHJQRLu?c`1@ibI_+fA zJ=L>z#SmGRgdPbe?)djtcmLpEVs=4OjwMEqBa~3MVv_xJ)bmO{oY(oq+vJnnts4xH zV3g}?j#GX>&d}#6->01lxjq;w$Gow9zEP(k&eMT;oQ{Mp2YwoMbs7?$p2PKhyO!l+ z$?0(k`_%9A{+R}R+_(fu95qr3xCZtq#e#We9}@D`Mxc^T|I5++yE9crOneB5$2E@# z1>sAUiYs4NHVI>_qC!`spvBH7%!}pq{qZhxXQ5BzpOCH@{YL&k+MNlt8*(EQ*Z5LS z`XP6ZNKbALo?~2|KgnBLE*3dw_~3A_Odsd7V*97H1EpbOv|&m=lkS@{xUBLoPQ=p=znkqTHLDC#GLj2fyc z8dNoE(yT>mlsGyp#uUenT9c%ZG{uxsP9;^BC5Nmz=9F_TxfU*h9ajtbvE))pt#Ddl zx#H;xg<3b>WDA>aaZ6j?%2s!FyX;}tJ??4Gd)aH_CJlYuVoNQz(&|A6O6drP9`Q&= zKFU!$O07!|U3=`Q=U!Z|i`vBcbp8P~n$-9tH5AjL25CxWg2r~DgBgf%AOKH;0EuHB z%zUO0c#s>+d|`BjGJ@0rr_mq=g5e<6PK(_KIdu~M4mSr7{5QzCf$kgRp1HlE*6R79 zlatVB!;w@k=)PY1kt^pq-jr`g_m#qT$DbSObsIsuF|R!+1-z61dd$2pQ;_zJ=Jbov z`EM%v)YPWI{Aj9YVA$o{EzmIU@S!ufZ3S1~`Ep+bv3#2ciqmDbiJo^HUTGG@(zWo? z6;<|II_+TtJ(Q=G|2(?80J?QI({(1F{GCF~x1|HWN&59Tw%!?0yx&6R%yQ>!wl5`T zlQmLDr_QO?xyU#rxoy*3UOHEX7Qc0#kHCJUulLCMn!P-5LZmyX#`v30FUH>F>>#82^QTpvEkoQb{C~ZVinF>f#p6Jk7yO~QSe%?ZDjOfecg+=wV6#>g}Q3E zHS^~dB#VWX|Ju6-+O>>gdm3WVPO0lCHOi-l(sA`+1YXM)cw} z?tc1~HS??c;~gG~RDV;XuSWM>#sAfibo?a3|6%tZuD8&v>le zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00Fg0L_t(I%e9luN+VGag}ts5Z*y-u6Gm98y5J4EGwx{?Gb?&+Fk7Hj6^Z8tD z+hS%&;`a8|z6E%AcuADU{oYW_KRba_!nqMGDDRFdk#QFKT0r&wB5lF(^IXgRJGMSK4 zLWogOaQfqvh#=4N&l%j`->d67B7(ZEsj7-$7|61WkT9Sq3RbHX%jJrcoU$yrxw$b1 zD9e(R(tF~&-40KQkU&C+rfG;F$dVDE_kbOs@B9533fvt@C<5M=5WKdpm>WX`SxOAU z@Bzs497zoQz%UHtqhgGJOixcwIutA-xW2wN b{>S_Q!P?s67)m|T00000NkvXXu0mjfAZBM= literal 0 HcmV?d00001 diff --git a/textures/magicalities_focus_atk_earth.png b/textures/magicalities_focus_atk_earth.png new file mode 100644 index 0000000000000000000000000000000000000000..5cea6a33b30c7bac689b8bf95d818c602ee1e231 GIT binary patch literal 2005 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 literal 0 HcmV?d00001 diff --git a/textures/magicalities_focus_atk_water.png b/textures/magicalities_focus_atk_water.png new file mode 100644 index 0000000000000000000000000000000000000000..31f2936d10b5ef4d9c69253257f3255d69795ac4 GIT binary patch literal 2156 zcmV-y2$T1TP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxb|fnf{AU%j1SDQ!IXusq9nA740Fkb;+wQ*S zcBP$UDFFqFkf6-?-+!n14?fJ|jSop;j?v=dv(H@cAohI9zLWL)u3zkZc(a@51;gaf zy7N_{+6U~6{;c+<^Ay;_%S3tTi~9be=tL~);CfU?j*bJX6PuzFIabg9e6MF&HfBk$ zOK94E>iZoA{F`<2E^!QzlE>Y%O(|wP3tOKMx4wY7wEaJhK7Tj2D+3b`N6z9d3!wvi zC$8Ym=g!x{E^P}Pq+pAUO?b{Xu0MZ%LT)Z}rTmT3=ZU_tzc6ifK<^9piJ|zkzqC{M zu$xy(H*YVVV|+Zn*#SPit@*OH{^#s6=Qyh?K4QsH7j>7ipU|(aXzfuESHgd=vVy&? zj7yLb4Rm&htm0~vi9zEePn`-)8oO=O0MYZ{gqFFnqh??fkde72?K0rUo3p7-M z3qFJpLkbddDAC20VKJt-Dr!kC`4m!2DM`wy7;)kyNR%WZSxV;YP;o;>K4!@|mjb5+ zGZ&05=uk@K>Z-4y#+s_sTuWoqT=Olo*iw_0Tj|_gM;`asQ9iOFgMJW)Ne_1)%mw4(-{H-G2>u()nMK_nF!zLPyEx>9w#C)XU+J#X}mx;N_)l+SHr0`iUHdSAzl-QHpAta0XLxll#MFekL5xe?o> zauGAs_7zdjr~B;A&o z{$Ru=z;qn!-CU)CW7wH?Y5Ii54AjslpEdoGRrVvR9+#Q2YN@y8xAM%Ep2m$dlFf!s z$-$=-RQ$BbH^`3bS)}Aj*67f#WAg`CfSI{`(Xm#tplt$GdfjsY&goQs$)}O|mxhwFRMDkb70(0oheL-X1(SN|&?FhV4-YM|X>LRJEFKUgLqg{-D&_IRr5wg?zgb^B9x>z{(&j43FdRR|d5ZF}}XZ0v!PnrE? zIs2$)=B1paGd}NfmNktv7}@H!fU}flk5#aay^Osb6(H}oUfhbLYwI?@Bm558_dD&+ z1z2&4QX9Q-Pcitkk-cELqo|cjEq-#1H)hQX#ox8i?YnG0yG&MhTI2$Be9inmkJvE| zw$XpsMa>^?{NEl3&h~3Q_TO)#{+o^bwB`p_6Q|2;{tp|4Lp4a84F&)J00v@9M??Vs z0RI60puMM)00009a7bBm000XU000XU0RWnu7ytkO2XskIMF-*x3=kU(q}XOr0000P zbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbOx=BPqR5;6}liO+(K@f(& z>gm}z?5ZS-K_xm-258_TDIXpfVtU28c%X{qw;J#;t;n6|F%QkSGkJ z-V%rx5H4Z=ol@wXRR@J`uy?G4D~J__9)|ZJ8=K{ukf#s}gc+3O1%+-c9SCy>APR#7 zvh8KcRRx^`KZZO3pWXz&q|nF4=gDg&)G%;x?*V8E+CeK&H}-ur0-3|?1g;v0GMK!0 zRG@DA=mJwYGY1FHc9FZ_Qn)@fVC=yyAgLhB4KV)&!5ii0 zug0s5^z@_BokOS~O(5L_@4!W%!1)ho0P!FROpbQ2Jo{DXHXlBHCtLt6L>^oRQDl{9 zvCJfg$>Bq$^7GGDE_93cZ%<5+>%IcLs4g?{z8uQ>StxV|SO7I;d3rks1ehG%M*aIV i7P`A~p31j%L;D++?x6`t*olb%0000