From 8bdecccb5416d06e8390973c6b05ec595066a2f4 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 15 Sep 2012 15:22:33 +0200 Subject: [PATCH] First commit --- init.lua | 219 ++++++++++++++++++++++++++++ textures/mobs_dirt_monster.png | Bin 0 -> 1249 bytes textures/mobs_dirt_monster_back.png | Bin 0 -> 1205 bytes 3 files changed, 219 insertions(+) create mode 100644 init.lua create mode 100644 textures/mobs_dirt_monster.png create mode 100644 textures/mobs_dirt_monster_back.png diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..b49c954 --- /dev/null +++ b/init.lua @@ -0,0 +1,219 @@ +minetest.register_entity("mobs:dirt_monster", { + hp_max = 5, + physical = true, + collisionbox = {-0.4, -1, -0.4, 0.4, 1, 0.4}, + visual = "upright_sprite", + visual_size = {x=1, y=2}, + textures = {"mobs_dirt_monster.png", "mobs_dirt_monster_back.png"}, + makes_footstep_sound = true, + + timer = 0, + attack = {player=nil, dist=nil}, + state = "stand", + v_start = false, + + VIEW_RANGE = 15, + + set_velocity = function(self, v) + local yaw = self.object:getyaw() + local x = math.sin(yaw) * -v + local z = math.cos(yaw) * v + self.object:setvelocity({x=x, y=self.object:getvelocity().y, z=z}) + end, + + get_velocity = function(self) + local v = self.object:getvelocity() + return (v.x^2 + v.z^2)^(0.5) + end, + + on_step = function(self, dtime) + + if self.object:getvelocity().y > 0.1 then + local yaw = self.object:getyaw() + local x = math.sin(yaw) * -2 + local z = math.cos(yaw) * 2 + self.object:setacceleration({x=x, y=-10, z=z}) + else + self.object:setacceleration({x=0, y=-10, z=0}) + end + + self.timer = self.timer+dtime + if self.state ~= "attack" then + if self.timer < 1 then + return + end + self.timer = 0 + end + + if minetest.env:get_timeofday() > 0.2 and minetest.env:get_timeofday() < 0.8 and minetest.env:get_node_light(self.object:getpos()) > 3 then + self.object:punch(self.object, 1.0, { + full_punch_interval=1.0, + groupcaps={ + fleshy={times={[3]=1/10}}, + } + }, nil) + end + + if string.find(minetest.env:get_node(self.object:getpos()).name, "default:water") then + self.object:punch(self.object, 1.0, { + full_punch_interval=1.0, + groupcaps={ + fleshy={times={[3]=1/1}}, + } + }, nil) + end + + if string.find(minetest.env:get_node(self.object:getpos()).name, "default:lava") then + self.object:punch(self.object, 1.0, { + full_punch_interval=1.0, + groupcaps={ + fleshy={times={[3]=1/2}}, + } + }, nil) + end + + for _,player in pairs(minetest.get_connected_players()) do + local s = self.object:getpos() + local p = player:getpos() + local dist = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5 + if dist < self.VIEW_RANGE then + if self.attack.dist then + if self.attack.dist < dist then + self.state = "attack" + self.attack.player = player + self.attack.dist = dist + end + else + self.state = "attack" + self.attack.player = player + self.attack.dist = dist + end + end + end + + if self.state == "stand" then + if math.random(1, 2) == 1 then + self.object:setyaw(self.object:getyaw()+((math.random(0,360)-180)/180*math.pi)) + end + if math.random(1, 100) <= 50 then + self.set_velocity(self, 1) + self.state = "walk" + end + elseif self.state == "walk" then + if math.random(1, 100) <= 30 then + self.object:setyaw(self.object:getyaw()+((math.random(0,360)-180)/180*math.pi)) + self.set_velocity(self, self.get_velocity(self)) + end + if math.random(1, 100) <= 10 then + self.set_velocity(self, 0) + self.state = "stand" + end + if self.get_velocity(self) <= 0.5 and self.object:getvelocity().y == 0 then + local v = self.object:getvelocity() + v.y = 5 + self.object:setvelocity(v) + end + elseif self.state == "attack" then + local s = self.object:getpos() + local p = self.attack.player:getpos() + local dist = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5 + if dist > self.VIEW_RANGE or self.attack.player:get_hp() <= 0 then + self.state = "stand" + self.v_start = false + self.set_velocity(self, 0) + self.attack = {player=nil, dist=nil} + return + else + self.attack.dist = dist + end + + local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z} + local yaw = math.atan(vec.z/vec.x)+math.pi/2 + if p.x > s.x then + yaw = yaw+math.pi + end + self.object:setyaw(yaw) + if self.attack.dist > 2 then + if not self.v_start then + self.v_start = true + self.set_velocity(self, 3) + else + if self.get_velocity(self) <= 0.5 and self.object:getvelocity().y == 0 then + local v = self.object:getvelocity() + v.y = 5 + self.object:setvelocity(v) + end + self.set_velocity(self, 3) + end + else + self.set_velocity(self, 0) + self.v_start = false + if self.timer > 1 then + self.timer = 0 + self.attack.player:punch(self.object, 1.0, { + full_punch_interval=1.0, + groupcaps={ + fleshy={times={[2]=1/1,[3]=1/2}}, + } + }, vec) + end + end + end + end, + + on_activate = function(self, staticdata) + self.object:set_armor_groups({fleshy=3}) + self.object:setacceleration({x=0, y=-10, z=0}) + self.state = "stand" + self.object:setvelocity({x=0, y=self.object:getvelocity().y, z=0}) + self.object:setyaw(math.random(1, 360)/180*math.pi) + end, + + on_punch = function(self, hitter) + if self.object:get_hp() <= 0 then + if hitter and hitter:is_player() and hitter:get_inventory() then + for i=1,math.random(0,3)+2 do + hitter:get_inventory():add_item("main", ItemStack("default:dirt")) + end + else + for i=1,math.random(0,3)+2 do + local obj = minetest.env:add_item(self.object:getpos(), "default:dirt") + if obj then + obj: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 + obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) + end + end + end + end + end, + +}) + +minetest.register_abm({ + nodenames = {"default:dirt_with_grass"}, + neighbors = {"default:dirt", "default:dirt_with_grass"}, + interval = 60, + chance = 5000, + action = function(pos, node) + pos.y = pos.y+1 + if minetest.env:get_node_light(pos) > 3 then + return + end + if minetest.env:get_node(pos).name ~= "air" then + return + end + pos.y = pos.y+1 + if minetest.env:get_node(pos).name ~= "air" then + return + end + minetest.env:add_entity(pos, "mobs:dirt_monster") + end +}) diff --git a/textures/mobs_dirt_monster.png b/textures/mobs_dirt_monster.png new file mode 100644 index 0000000000000000000000000000000000000000..1f543441caca60ea91bbec713e749b06a5d3d485 GIT binary patch literal 1249 zcmV<71Rnc|P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyq{ z2>>avIHxcG000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000C$NklK9K z9xfM%hl9MFh!Kl~x$^r1#1;Y;blY8CKQ@dJXmt#WnKI2SgX2RedUXa9eb^$X*yKx9 z?mx=nw?!w%k_^OqrCMw7+ubM3933Q+^T2@XfMwf)Ydb8g7HPE&!^t?V&%x)|xUNNV zAWF5?P;mr*z|XzK9Nzi{Y74d{$i?$hblY7V%i_fB7&mV%p{f{zs-*y=5-|V<;=K~> z5Apq#I|O_VC^$2R)7*Zr!f-OqWwW#1Vm93RptIdR&Cp+w%#OPtcqn6)Tmy$ zcAMq=8rt1ndoUHpt28)!>NQgFUMh`Es`U-do}6H_-6G&R1pE$8wp8WFNJ<_&TIETm z%qyvWY(>BL?k51gz4kW%Uw?9edy6X+i&Y8w{bX|Gmh&E; zzITG>)oQUqZz#Y@zCuS0PHwG+jSvpGoI5j3G#25~^1fa`aOg?hk-T(QFJ)F`H76>?!=nuQBuC4RO-N!nTjEUs{xqJnq@akBKa=l5lzQOUy zA!2=DR&r&GF{mm%L6@27aW1?yOC;ncQ}A#KYZZEeE*%3HI6F6iG4R9HTO|5=u`I|I zsuYSfq7mQrjn*ohnVaP5FL!a?eS419W{cH)nR^SX^c6jlhx!l^O63{|*a(r3pNYe1 z=KoxxtIFbXiJ@cyJK$JsZEbzoF@{2=j%!=Eu8;BI6bsoh#w#Xne4YB{7U@Kkt_t0*QmHjD2I`wzvg?6u3D$-4Gko~| z+3laIQ1jNAIGjd1O2KQ=Z7T?DwpvV0q&Yb?!d9zIDBx#yYV;Wo*zrIQ@IZDv;Aszd z0S_2S#`s@7(0x3RY@w=8d7wKU$kQI^9uH)X2NDVSb&m%+luXFKsxalf%%YPg00000 LNkvXXu0mjfnFc@< literal 0 HcmV?d00001 diff --git a/textures/mobs_dirt_monster_back.png b/textures/mobs_dirt_monster_back.png new file mode 100644 index 0000000000000000000000000000000000000000..3de463df4ef6d6d6ecebdccbfa581d79ad8225ef GIT binary patch literal 1205 zcmV;m1WNmfP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyq{ z2?7|>(8Y)V000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000CKNkl2ZCz=@)-8juF}ngXM25&1D4>Zqn3#A0(U=%-xKI-kHQtyQ zE+z4TM7_WmFTCc_&w0EUwh~sxjVC!*@B9AG z|9Rf$|2y!1K1W73$?@c4(J0b@20-?}?E$iKPu}foLp)$Kyh5p=R5(wYsq^ z!7P+fN-;Fh%_pbMDh=T1!C^Un@dmSr3}P*Rq^~D{kt;H`>v?(t9ps9On1wQ9JHsqi zE4ZDG<~{i0@Lt&*-oWXzSLp6quD>hbXKH$mAI{x;?2Kb2f!TyX&Ma|YY?ypufy?9f z=nD8(Z1#!*US|ttsmxzj@8E8M-nD-2&cslnKieFH2YQj3pfrWY?FCI^u~K1kxVQNn z96z#8e4Xt?69$$g*tX4V(nM3>(4pPqqExQnb~&+uQ-6-Dy1=Jz?Ur~VhsV=`ugy!% zwuz<;wuje&uHks}UcWg*PoRzY%mPX&e!MWbe2wu$4qM>4{vNW05@w;y_Q*Oq{cX&} zv)Hzch|ubBGQ4$=H(q^#cCV|^gI13dx7!IejE#iZGcv^Z?T6gDJBOwqmNdCG@c>;d z&qz9xV{|0axP`Hi2=j?7Q}^fbrwl?}ew0$Avw2XUqiFZK2oLl!acc%kgz4FI!@=Zq zl)~Z? z4u#9@Vrn{$u~0^I)o@^#1ss~j=#BxdkIx_?*fxkJoV#?p&Vx<;-T2mcIdlFd)}zpA z01i!KeJDU=a08<|2HE}MMpoiMG-Z;>7V&vpys~qsA<)+9Wb2lGUi;{ziX{zVDHBa; z6pBkIr9goohzOs3e^%+bPJW@(5D;59fAI#usyqN5EN-kE=V;PEDMh>6g=Ja%9W$uSW#|g{>U;hT(u#3@`^|lI z9?Zrw2+JisGY|5{LY)Umql8rzP&DPi6D5q_x`$;6!8IMsCQS;Zr8*BLCTCU`kVi0y zrVMrrJ;{SrOIVEuO_BD&{%sQJ4-pJ@VB7Hfg>i!Z4o?1dRUJFDOOmNPzV;UOytIXM zCdY^0oM|BKr_T?|d?L%8nK=Fq4<~-T{KWs_=)qx$4E8b~&tZvBvuwUTeMS8PPp9N! Tn;3iy00000NkvXXu0mjfg?u*_ literal 0 HcmV?d00001