From 1f02ceebafc9daa98a7bcb3bad16582a93f5195c Mon Sep 17 00:00:00 2001 From: crabman77 Date: Fri, 4 Mar 2016 21:44:08 +0100 Subject: [PATCH] update mobs, readd cow replace with dung --- mods/mobs/README.txt | 1 + mods/mobs/api.lua | 160 +++++++++++++++-------- mods/mobs/cow.lua | 2 +- mods/mobs/sheep.lua | 3 +- mods/mobs/textures/mobs_sheep_base.png | Bin 649 -> 635 bytes mods/mobs/textures/mobs_sheep_shaved.png | Bin 927 -> 983 bytes mods/mobs/textures/mobs_sheep_white.png | Bin 0 -> 3230 bytes mods/mobs/textures/mobs_sheep_wool.png | Bin 1061 -> 1028 bytes 8 files changed, 105 insertions(+), 61 deletions(-) mode change 100755 => 100644 mods/mobs/textures/mobs_sheep_base.png mode change 100755 => 100644 mods/mobs/textures/mobs_sheep_shaved.png create mode 100755 mods/mobs/textures/mobs_sheep_white.png mode change 100755 => 100644 mods/mobs/textures/mobs_sheep_wool.png diff --git a/mods/mobs/README.txt b/mods/mobs/README.txt index 68bc5b5c..a7437835 100755 --- a/mods/mobs/README.txt +++ b/mods/mobs/README.txt @@ -28,6 +28,7 @@ This mod contains the following additions: Changelog: +1.27- Added new sheep, lava flan and spawn egg textures. New Lava Pick tool smelts what you dig. New atan checking function. 1.26- Pathfinding feature added thanks to rnd, when monsters attack they become scary smart in finding you :) also, beehive produces honey now :) 1.25- Mobs no longer spawn within 12 blocks of player or despawn within same range, spawners now have player detection, Code tidy and tweak. 1.24- Added feature where certain animals run away when punched (runaway = true in mob definition) diff --git a/mods/mobs/api.lua b/mods/mobs/api.lua index 336a874b..21693212 100755 --- a/mods/mobs/api.lua +++ b/mods/mobs/api.lua @@ -1,4 +1,4 @@ --- Mobs Api (17th February 2016) +-- Mobs Api (4th March 2016) mobs = {} mobs.mod = "redo" @@ -20,6 +20,16 @@ local stuck_path_timeout = 10 -- how long will mob follow path before giving up local pi = math.pi local square = math.sqrt +local atan = function(x) + + if x ~= x then + --error("atan bassed NaN") + print ("atan based NaN") + return 0 + else + return math.atan(x) + end +end do_attack = function(self, player) @@ -129,6 +139,34 @@ set_animation = function(self, type) end end +-- check line of sight for walkers and swimmers alike +function line_of_sight_water(self, pos1, pos2, stepsize) + + local s, pos_w = minetest.line_of_sight(pos1, pos2, stepsize) + + -- normal walking and flying mobs can see you through air + if s == true then + return true + end + + -- swimming mobs can see you through water + if s == false + and self.fly + and self.fly_in == "default:water_source" then + + local nod = minetest.get_node(pos_w).name + + if nod == "default:water_source" + or nod == "default:water_flowing" then + + return true + end + end + + return false + +end + -- particle effects function effect(pos, amount, texture, max_size) @@ -285,6 +323,24 @@ local function is_at_cliff(self) return false end +-- get node but use fallback for nil or unknown +local function node_ok(pos, fallback) + + fallback = fallback or "default:dirt" + + local node = minetest.get_node_or_nil(pos) + + if not node then + return minetest.registered_nodes[fallback] + end + + if minetest.registered_nodes[node.name] then + return node + end + + return minetest.registered_nodes[fallback] +end + -- environmental damage (water, lava, fire, light) do_env_damage = function(self) @@ -315,15 +371,16 @@ do_env_damage = function(self) effect(pos, 5, "tnt_smoke.png") end + -- what is mob standing in? + pos.y = pos.y + self.collisionbox[2] + 0.1 -- foot level + self.standing_in = node_ok(pos, "air").name + --print ("standing in " .. self.standing_in) + if self.water_damage ~= 0 or self.lava_damage ~= 0 then - pos.y = pos.y + self.collisionbox[2] + 0.1 -- foot level + local nodef = minetest.registered_nodes[self.standing_in] - local nod = node_ok(pos, "air") ; --print ("standing in "..nod.name) - local nodef = minetest.registered_nodes[nod.name] - - if not nodef then return end --MFF fix crash pos.y = pos.y + 1 -- water @@ -338,8 +395,8 @@ do_env_damage = function(self) -- lava or fire if self.lava_damage ~= 0 and (nodef.groups.lava - or nod.name == "fire:basic_flame" - or nod.name == "fire:permanent_flame") then + or self.standing_in == "fire:basic_flame" + or self.standing_in == "fire:permanent_flame") then self.object:set_hp(self.object:get_hp() - self.lava_damage) @@ -462,24 +519,6 @@ function entity_physics(pos, radius, self) --/MFF (Crabman|06/23/2015)add self t end end --- get node but use fallback for nil or unknown -function node_ok(pos, fallback) - - fallback = fallback or "default:dirt" - - local node = minetest.get_node_or_nil(pos) - - if not node then - return minetest.registered_nodes[fallback] - end - - if minetest.registered_nodes[node.name] then - return node - end - - return minetest.registered_nodes[fallback] -end - -- should mob follow what I'm holding ? function follow_holding(self, clicker) @@ -1117,7 +1156,8 @@ minetest.register_entity(name, { -- field of view check goes here -- choose closest player to attack - if minetest.line_of_sight(sp, p, 2) == true + --if minetest.line_of_sight(sp, p, 2) == true + if line_of_sight_water(self, sp, p, 2) == true and dist < min_dist then min_dist = dist min_player = player @@ -1246,7 +1286,7 @@ minetest.register_entity(name, { if vec.x ~= 0 and vec.z ~= 0 then - yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if p.x > s.x then yaw = yaw + pi @@ -1283,6 +1323,19 @@ minetest.register_entity(name, { end end + -- water swimmers flop when on land + if self.fly + and self.fly_in == "default:water_source" + and self.standing_in ~= self.fly_in then + + self.state = "flop" + self.object:setvelocity({x = 0, y = -5, z = 0}) + + set_animation(self, "stand") + + return + end + if self.state == "stand" then if math.random(1, 4) == 1 then @@ -1315,7 +1368,7 @@ minetest.register_entity(name, { if vec.x ~= 0 and vec.z ~= 0 then - yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if lp.x > s.x then yaw = yaw + pi @@ -1350,22 +1403,6 @@ minetest.register_entity(name, { local s = self.object:getpos() local lp = minetest.find_node_near(s, 1, {"group:water"}) - -- water swimmers cannot move out of water - if self.fly - and self.fly_in == "default:water_source" - and not lp then - - --print ("out of water") - - set_velocity(self, 0) - - -- change to undefined state so nothing more happens - self.state = "flop" - set_animation(self, "stand") - - return - end - -- if water nearby then turn away if lp then @@ -1378,7 +1415,7 @@ minetest.register_entity(name, { if vec.x ~= 0 and vec.z ~= 0 then - yaw = math.atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate + yaw = atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate if lp.x > s.x then yaw = yaw + pi @@ -1480,7 +1517,7 @@ minetest.register_entity(name, { if vec.x ~= 0 and vec.z ~= 0 then - yaw = math.atan(vec.z / vec.x) + pi / 2 - self.rotate + yaw = atan(vec.z / vec.x) + pi / 2 - self.rotate if p.x > s.x then yaw = yaw + pi @@ -1657,7 +1694,7 @@ minetest.register_entity(name, { if vec.x ~= 0 and vec.z ~= 0 then - yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if p.x > s.x then yaw = yaw + pi @@ -1720,7 +1757,8 @@ minetest.register_entity(name, { p2.y = p2.y + 1.5 s2.y = s2.y + 1.5 - if minetest.line_of_sight(p2, s2) == true then + --if minetest.line_of_sight(p2, s2) == true then + if line_of_sight_water(self, p2, s2) == true then -- play attack sound if self.sounds.attack then @@ -1756,7 +1794,7 @@ minetest.register_entity(name, { if vec.x ~= 0 and vec.z ~= 0 then - yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if p.x > s.x then yaw = yaw + pi @@ -1868,7 +1906,8 @@ minetest.register_entity(name, { local up = 2 -- if already in air then dont go up anymore when hit - if v.y > 0 then + if v.y > 0 + or self.fly then up = 0 end @@ -1896,7 +1935,7 @@ minetest.register_entity(name, { if vec.x ~= 0 and vec.z ~= 0 then - local yaw = math.atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate + local yaw = atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate if lp.x > s.x then yaw = yaw + pi @@ -1912,14 +1951,13 @@ minetest.register_entity(name, { -- attack puncher and call other mobs for help if self.passive == false + and self.state ~= "flop" and self.child == false and hitter:get_player_name() ~= self.owner then - --if self.state ~= "attack" then - -- attack whoever punched mob - self.state = "" - do_attack(self, hitter) - --end + -- attack whoever punched mob + self.state = "" + do_attack(self, hitter) -- alert others to the attack local obj = nil @@ -2031,6 +2069,7 @@ minetest.register_entity(name, { self.mesh = mesh self.collisionbox = colbox self.visual_size = vis_size + self.standing_in = "" -- set anything changed above self.object:set_properties(self) @@ -2266,6 +2305,11 @@ function mobs:explosion(pos, radius, fire, smoke, sound) and data[vi] ~= c_chest then local n = node_ok(p).name + local on_blast = minetest.registered_nodes[n].on_blast + + if on_blast then + return on_blast(p) + end if not minetest.is_protected(p, "") --/MFF (Crabman|06/23/2015) re-added node protected in areas and minetest.get_item_group(n, "unbreakable") ~= 1 @@ -2419,7 +2463,7 @@ function mobs:register_egg(mob, desc, background, addegg) local invimg = background if addegg == 1 then - invimg = invimg .. "^mobs_chicken_egg.png" + invimg = invimg .. "^mobs_chicken_egg.png" -- MFF end minetest.register_craftitem(mob, { diff --git a/mods/mobs/cow.lua b/mods/mobs/cow.lua index 64f9fe2c..7b333572 100755 --- a/mods/mobs/cow.lua +++ b/mods/mobs/cow.lua @@ -60,7 +60,7 @@ mobs:register_mob("mobs:cow", { view_range = 7, replace_rate = 10, replace_what = {"default:grass_3", "default:grass_4", "default:grass_5", "farming:wheat_8"}, - replace_with = "air", + replace_with = "mobs:dung", fear_height = 2, on_rightclick = function(self, clicker) diff --git a/mods/mobs/sheep.lua b/mods/mobs/sheep.lua index 45e1104e..c7f64173 100755 --- a/mods/mobs/sheep.lua +++ b/mods/mobs/sheep.lua @@ -22,7 +22,6 @@ local all_colours = { for _, col in pairs(all_colours) do mobs:register_mob("mobs:sheep_"..col[1], { - -- animal, monster, npc, barbarian type = "animal", -- not aggressive @@ -36,7 +35,7 @@ for _, col in pairs(all_colours) do visual = "mesh", mesh = "mobs_sheep.b3d", textures = { - {"mobs_sheep_wool.png^[colorize:" .. col[3] .. "^mobs_sheep_base.png"}, + {"mobs_sheep_base.png^(mobs_sheep_wool.png^[colorize:" .. col[3] .. ")"}, }, -- specific texture and mesh for gotten gotten_texture = {"mobs_sheep_shaved.png"}, diff --git a/mods/mobs/textures/mobs_sheep_base.png b/mods/mobs/textures/mobs_sheep_base.png old mode 100755 new mode 100644 index 1d9c171b558c6730118faf43786ee9bb074a46cc..c3c2c4a1c080c340a8cfab78d92dfdbcaf3ed7f5 GIT binary patch delta 376 zcmV-;0f+vH1^Wb$BnZ7wOjJcrK{$~t9+6F)1Sd82tdZ?Ge**y(6E=}F83zCW0XIoR zK~y-)?UKQA!ypVq6F{I!2;89@@)7?3-|ON8+?z8!XFc}7_>I_=xZOVb=-=YR968A) zn1HWIrU2y6XyzjCq{uCCpa)JuaI&y$*FqK!BY*OWHxT;#I z^&k-jEuA1UISt9(G7itEAAI3 WcoW7UdE9dV0000Z zfBn%C^IqZ>S_2AK*MYd8m;w6#x3C>1f}3Ip2pv0|6H2k zfU3(_X@_muV7-h-e;cjNCsJ)sxG-I64=q5KG3G*4r`DEMs8IiAJV3X!^N5*RYn7;_ z;PHUgm|zcB-1=}iSFTLtz8>xcF@Uyb*G@fFhEywY2FEuq_z}VCbN7If8mW}Z`G_#M z0|vCop3V4xachDT@^4J|e#{YK=$1y0i5D*0(nRZLiD%czWpb2^=gRp==cCYxqS$s=rG_sb@cMLxZ>`e1SkCmJ88`Z*4yC7%Nxi5u{~X z`?fufeSaYLeY@X#ujrY;9+g><)X3%#(%v=o;{fS#>}$@g*D{9Dm7B;$1K1i#*B{r8 z{dm3hW3O+gz44e#XDU?-Qf&69=hM3)Jn$X6x_9l$V;J2h4%~BD5AGW_4@9tjZ>&|2&FZ5v1=)0`fp)6e-pO;-F_})zm&?TiNL)oc{s-@u z%VH}x4`2&6nNBYLeD>ZLbqpX{Ff2>*OIW-If63iu%1Hunu^v=wY5_bdnh*_(?<{tu z*-m7l!|8PP0D^zi2av)xXvK&)<#{jSXg;0!G7!<%!P_WXgV+OU%zM%Oe^J;yPzLXO fTJHl`=Dqk2w;w_2Z!K;z00000NkvXXu0mjfH^hyg delta 797 zcmV+&1LFMG2cHL!kADLCNklHI8im^_kRbrOtS_&Z~kr;tZIoxFM)f}@K*lJi3xh^3{cv8fV zIA;zFP$T&>;LM2uWDbcU&Uyk^@QR~a@z+rNm9w~36C4B#N`IN-WE2f#8eDk!Z~>4v z96rP196}C?^00~;z{|qn<9c728HC1>z`^nny2f7v&LkfqSA>IL(E%{zfdrW<#VZhM z059xCT&W=`BVrUi1z~({A3`YA3^-36z5Fe1IQvU|5i_z(9gAq1{$jxKtv+QnbTb_* zB~nL;IZ{tw>VH4Yfb-O`3I%;HV1oCT`jXUu^VAWg4=T5CBKtVi&(XxfnSVNF(Hd$l zY(n0lmU?K5XeqEw9U&urAVCozazi)K@5-&Kcbz&4R1K;{;Feh`S_YbG;<3U@B3B$4 z!HAPINHC*iB%u(cNV`P_J1}^Y8;7SOl`)yZt%}@Q>wlxS(R;(HxfE?m;2pMj1y-cx zoJv{m`|Ghi9*=E|v94>^iX_G;u&PRO6T~KMJoeY?2kUk0`~KMOYZC|$#>S1=g4Ar= z*tW;98*<;b`+e;VJrmfYGAoj@Y!0D1Mor^5Kze|3&AGQ?!|2LQWFrIiPBQ9`>&Je) zUORy8?SE=#n@p!FH4Rd9_GskOy8!||Jga*{A{$2ciH5TnQQuxs56xp&U{86~>BD5A zGW?%)kA#Q`=)I5owiy!1j9wetFrq1*Y>cZu17;2SP2Bj|-dk;RGM&f+Q;r_Y3`Wwz zDXXsSx!!xyB(ySevZZY%^>)2@inwi{U9GjhlYi${Z8DvlFPDo4khqC>{14tQmql0Z z9>5-SGM!xf`Ru(iRvSRHU|5#qm#}yb{*s5zl#>MDqCHr(sRi&@(S&GNd}q-sO(zo_ zPN%a65d2mjKnm-i6(!=7=e>xd`E=%sA);@_+bL^<=mTlYd(r)WQRqETjCVe@_W>;P bUKacZ*ZD#F@pX@U00000NkvXXu0mjf{_K1q diff --git a/mods/mobs/textures/mobs_sheep_white.png b/mods/mobs/textures/mobs_sheep_white.png new file mode 100755 index 0000000000000000000000000000000000000000..6844413e88ff6a4e47ff887d41c4e3bfca8e334f GIT binary patch literal 3230 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 Qi~s-t07*qoM6N<$g4v-F{r~^~ literal 0 HcmV?d00001 diff --git a/mods/mobs/textures/mobs_sheep_wool.png b/mods/mobs/textures/mobs_sheep_wool.png old mode 100755 new mode 100644 index 1c3e0be899a73481d58a67be2053c5f0de8f483a..2dca0dc8d4571b93c7ad792ada7d91b37f94867c GIT binary patch delta 769 zcmV+c1OEJ_2!sfbBn7%qOjJdYEV=~jPAdN$S{0u~f7C*?ar0008RNkl>wC;|L3~9=Z@3P&&fd&VEMtu#TK$8fSmWDH-MO9 z*lP%|hji$1jv-Jt`Haal)n_9hlp6}F|As&lZufH`zmq75|}BGO_a zu&TCTV(yD5Ug`qsL$A@ek`z%vs~JQYz$qVDp~XrwYj)^;G*ZvO5UHimjtQltv2#1L zUa(fQ!=bl93$6x9aFP)2y7698J-6{Xw1a;gFu=Rs3Wv`uNDf70*(Rr5KMNMxZAczK z9C~ri%~**_^KTm@c(-L;-Mc-94mJG2p6xI8SUjl=KiFd-BuIEN!5NP`$1x;eh5xq4 zi9?rW!xst2QOqNIB9qMPp38?_%2X=tbUkEx;zmk4zkvE*)?RAG7tPSd(h<2b(E9w3)$d9}yh(XeqE@7;Ju>W=m8cEg#Re?IFHf>OBDiVIHnaf;I# zv13$-LcfBwl(734%Z|txOD(a)b&8?vstEocygsv`2EyRC00000NkvXXu0mjfUh#VO delta 803 zcmV+;1Kj+C2&D*+BnZ7wOjJb}6cdptx&+slu=|ncIe!8Y3L6p)SVB?&00QAjL_t(I z%XO5EuAD3ohPi@f^JTNU5fM!n5Q>OG5X^A@xAl$fIbF|B2NF>pXNH#n5@Ue~q3A8f zR8rV$2yqX2$v9JXNOKAqwoFRga>Ax_EV*tq)-=bQqRt_vT4IJ6Bcub&HQ=;_7)qT> zhJ6lopMNbZ=qZ#^_Yg4>DYn*BTvajHTvT0ZoR^ZEfyM8|po@qRz!A)>`YN(2-T;`Y zORyfI(fFP~RR_t2nhmiA^MheiTQI5gAizrvQHi{m6j@a@83$PrqdW}I#vwZ869WoX znprayw3?%UJ{hU!V2F?&T4=pe(%88jS}#~D+J8Z6DYRpv4O(zDNFt?;Y+#P}lIpol z_n{r^00TM`!rix4IBc^Zjs0zn)2^Qd3+*;!AEPJ%M3F77*SQ%xc{dro+lsF4O&*o! zH+jMzdEV`>Jlj9yc{htYRpK}D*cfum;RJ@5BLn_h9w$t2#^Z{l*>EDqzo0p)Co##q z?ti&tLMdge$I)9^y>i^J-ZrMBVvwL=5FGVxSpFO30FCz}6klL!z+O(?^XaZPHA2&+wRFa;NyX8uGgW$BDMNNZ(^u3ioXa{R?zLc-1w>xPLuBLXJr$WpJn^dx4C$!~J&q^LBs#OfTGE z-OMLY|6=X!dLf^UOHPfWr_fH&+kam;A~|mqKY`H-djAeoT>A9{dL?=DH8Sa>I?l)` zM`I-Y2IP$~9~R@BRs5UK4d+yv&*0bCmxfBL5&i6YmZ>l+<&eg zxogus&2dIfpfS&;xjrtJ>yjKvjZdVW*nd7A_$TKd_ZmV_3SF(}aC(kYn%0B^qe2q;3|4@!`;=fuWK2*Y hL0YF2U{@gc|09dB#+Dw2e*gdg00>D%PDHLkV1n80cNqWx