From c202b2e7c38e46fa09fe965334278625a3f8a3fb Mon Sep 17 00:00:00 2001 From: ElCeejo Date: Fri, 14 Oct 2022 20:07:51 -0700 Subject: [PATCH] More improvements --- boids.lua | 2 +- methods.lua | 60 +++++++++++------- mob_meta.lua | 5 +- spawning.lua | 10 +-- ... => creatura_spawning_crystal_outline.png} | Bin 5173 -> 5092 bytes ... => creatura_spawning_crystal_primary.png} | Bin 5208 -> 5273 bytes .../creatura_spawning_crystal_secondary.png | Bin 0 -> 698 bytes 7 files changed, 47 insertions(+), 30 deletions(-) rename textures/{creatura_spawning_crystal_overlay.png => creatura_spawning_crystal_outline.png} (56%) rename textures/{creatura_spawning_crystal.png => creatura_spawning_crystal_primary.png} (54%) create mode 100644 textures/creatura_spawning_crystal_secondary.png diff --git a/boids.lua b/boids.lua index 2bbefc9..58d81b7 100644 --- a/boids.lua +++ b/boids.lua @@ -226,4 +226,4 @@ function creatura.get_boid_angle(self, _boids, range) table.insert(vert_params, vert_cohesion + (lift - vert_cohesion) * 0.1) end return average_angle(params), average(vert_params) -end \ No newline at end of file +end diff --git a/methods.lua b/methods.lua index bf785ad..011485d 100644 --- a/methods.lua +++ b/methods.lua @@ -106,7 +106,7 @@ end]] local get_node_def = creatura.get_node_def --local get_node_height = creatura.get_node_height_from_def -function creatura.get_collision_ranged(self, dir, range) +function creatura.get_collision_ranged(self, dir, range, water) local pos, yaw = self.object:get_pos(), self.object:get_yaw() if not pos then return end local width = self.width + 0.1 @@ -120,6 +120,7 @@ function creatura.get_collision_ranged(self, dir, range) local height_half = self.height * 0.5 local center_y = pos.y + height_half -- Loop + local n_def local cos_yaw = cos(yaw) local sin_yaw = sin(yaw) local pos_x, pos_y, pos_z = ahead.x, ahead.y, ahead.z @@ -137,16 +138,26 @@ function creatura.get_collision_ranged(self, dir, range) y = pos_y, z = sin_yaw * ((pos_x + x) - pos_x) + pos_z } + local step_flag = false for y = 0, height, height / ceil(height) do + if y > self.height + and not step_flag then + break + end pos2.y = pos_y + y - if pos2.y - pos_y > (self.stepheight or 1.1) - and get_node_def(pos2).walkable then - local dist_dngr = (height_half - abs(center_y - pos2.y)) / height_half - local field_dngr = vec_dot(dir, vec_normal(vec_dir(pos, pos2))) - local ttl_dngr = dist_dngr + field_dngr - if ttl_dngr > danger then - danger = ttl_dngr - collision = pos2 + n_def = get_node_def(pos2) + if n_def.walkable + or (water and (n_def.groups.liquid or 0) > 0) then + if pos2.y - pos_y > (self.stepheight or 1.1) then + local dist_dngr = (height_half - abs(center_y - pos2.y)) / height_half + local field_dngr = vec_dot(dir, vec_normal(vec_dir(pos, pos2))) + local ttl_dngr = dist_dngr + field_dngr + if ttl_dngr > danger then + danger = ttl_dngr + collision = pos2 + end + else + step_flag = true end end end @@ -263,13 +274,16 @@ local steer_directions = { return output_dir end]] -local function get_collision_single(pos) +local function get_collision_single(pos, water) local pos2 = {x = pos.x, y = pos.y, z = pos.z} - if get_node_def(pos2).walkable then + local n_def = get_node_def(pos2) + if n_def.walkable + or (water and (n_def.groups.liquid or 0) > 0) then pos2.y = pos.y + 1 - local col_max = get_node_def(pos2).walkable + n_def = get_node_def(pos2) + local col_max = n_def.walkable or (water and (n_def.groups.liquid or 0) > 0) pos2.y = pos.y - 1 - local col_min = col_max and get_node_def(pos2).walkable + local col_min = col_max and (n_def.walkable or (water and (n_def.groups.liquid or 0) > 0)) if col_min then return pos else @@ -279,13 +293,13 @@ local function get_collision_single(pos) end end -function creatura.get_context_steering(self, goal, range) +function creatura.get_context_steering(self, goal, range, water) local pos, yaw = self.object:get_pos(), self.object:get_yaw() if not pos or not yaw then return end range = range or 8; if range < 2 then range = 2 end local width, height = self.width, self.height local dir2goal = vec_normal(vec_dir(pos, goal)) - local output_dir = {x = 0, y = 0, z = 0} + local output_dir = {x = 0, y = dir2goal.y, z = 0} pos.y = (pos.y + height * 0.5) local collision @@ -299,14 +313,14 @@ function creatura.get_context_steering(self, goal, range) if interest > 0 then if width <= 0.5 and height <= 1 then - collision = get_collision_single(vec_add(pos, dir)) + collision = get_collision_single(vec_add(pos, dir), water) else - _, collision = creatura.get_collision_ranged(self, dir, range) + _, collision = creatura.get_collision_ranged(self, dir, range, water) end if collision then dir2col = vec_normal(vec_dir(pos, collision)) local dist2col = vec_dist(pos, collision) - width - dir.y = dir2col.y * -1 + dir.y = ((dir2col.y * -1) + dir2goal.y * 1.5) / 2 local dot_weight = vec_dot(dir2col, dir2goal) local dist_weight = (range - dist2col) / range interest = interest - dot_weight @@ -373,6 +387,7 @@ function creatura.action_fallover(self) local zrot = 0 local init = false local dir = 1 + local rot = self.object:get_rotation() local function func(_self) if not init then _self:animate("stand") @@ -381,10 +396,11 @@ function creatura.action_fallover(self) end init = true end - local rot = _self.object:get_rotation() + rot = _self.object:get_rotation() local goal = (pi * 0.5) * dir - local dif = abs(rot.z - goal) - zrot = rot.z + (dif * dir) * 0.15 + local step = _self.dtime + if step > 0.5 then step = 0.5 end + zrot = zrot + (pi * dir) * step _self.object:set_rotation({x = rot.x, y = rot.y, z = zrot}) if (dir > 0 and zrot >= goal) or (dir < 0 and zrot <= goal) then return true end @@ -577,4 +593,4 @@ creatura.register_movement_method("creatura:context_based_steering", function(se _self:turn_to(dir2yaw(steer_to or vec_dir(pos, goal)), turn_rate) end return func -end) \ No newline at end of file +end) diff --git a/mob_meta.lua b/mob_meta.lua index edff7d1..57c85ee 100644 --- a/mob_meta.lua +++ b/mob_meta.lua @@ -459,7 +459,7 @@ end function mob:set_scale(x) local def = minetest.registered_entities[self.name] - local scale = def.visual_size + local scale = def.visual_size or {x = 1, y = 1} local box = def.collisionbox local new_box = {} for k, v in ipairs(box) do @@ -559,7 +559,8 @@ end local function is_group_in_table(tbl, name) for _, v in pairs(tbl) do - if minetest.get_item_group(name, v:split(":")[2]) > 0 then + if type(v) == "string" + and minetest.get_item_group(name, v:split(":")[2]) > 0 then return true end end diff --git a/spawning.lua b/spawning.lua index e805d4d..8baa91c 100644 --- a/spawning.lua +++ b/spawning.lua @@ -41,8 +41,8 @@ end function creatura.register_spawn_egg(name, col1, col2, inventory_image) -- deprecated if col1 and col2 then - local base = "(creatura_spawning_crystal.png^[multiply:#" .. col1 .. ")" - local spots = "(creatura_spawning_crystal_overlay.png^[multiply:#" .. col2 .. ")" + local base = "(creatura_spawning_crystal_primary.png^[multiply:#" .. col1 .. ")" + local spots = "(creatura_spawning_crystal_secondary.png^[multiply:#" .. col2 .. ")" inventory_image = base .. "^" .. spots end local mod_name = name:split(":")[1] @@ -73,8 +73,8 @@ function creatura.register_spawn_item(name, def) local inventory_image if not def.inventory_image and def.col1 and def.col2 then - local base = "(creatura_spawning_crystal.png^[multiply:#" .. def.col1 .. ")" - local spots = "(creatura_spawning_crystal_overlay.png^[multiply:#" .. def.col2 .. ")" + local base = "(creatura_spawning_crystal_primary.png^[multiply:#" .. def.col1 .. ")" + local spots = "(creatura_spawning_crystal_secondary.png^[multiply:#" .. def.col2 .. ")" inventory_image = base .. "^" .. spots end local mod_name = name:split(":")[1] @@ -658,4 +658,4 @@ function creatura.register_abm_spawn(mob, def) end }) end -end \ No newline at end of file +end diff --git a/textures/creatura_spawning_crystal_overlay.png b/textures/creatura_spawning_crystal_outline.png similarity index 56% rename from textures/creatura_spawning_crystal_overlay.png rename to textures/creatura_spawning_crystal_outline.png index 439e4440c93d59b252dad08e2011c04acd3504d2..f839e523a825dde8e8aacc4d579fe59193d86247 100644 GIT binary patch delta 1955 zcmV;U2VD5IDC8%QB!Ap`R9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}?N(coRXshuvmYBVCJM;{ONmml%j`e?Zsspsym@P^`rx8- z8!j7d{Kkv;CqMC4-dPe-d|Mz+%w?w=LUP91rR*&?OhMd*Py z>ygjefwsbNIMO4bm*KoWw=yvCE+iXf7JHzS{$okqK4vj|nsB&dVI+P7m4E=GaRy4; zmCVQ7+&Ox4eShUxvrI-An7c5hw$#U^E#=|Uw98??9l1+B(R$iR7rR_x_z6+CBl9Do zXs;04%4%yhw6>4U#wP1uBl zq&eV#Y0HO;taR6wbe?U?j~QS1EdJC6<|ofz~)Gl9BrQ26CsZQ{3IYp19B!) zh*Y@(C4XBH2XfE_h>d4FjlHaVnDO=m5h_kRsELw5mbHrV@irLLP*PE=s!qKIjhdXe z-eJyp*I&cQi??3A^WFy^eF_q6(BOg(A;gd(M=^L!YeYZB5MxXUK@&VDJe{y3rOa8f z&6-{IIpmmALHQJ0w7B9+D6yoh%ze%pP1bl2B?gnfScBR7(*^a{iFVGw7+V74zB7P==FZs`$Xf2q zWps_fcL!ae43yf*sni(*gLWs@Mi+NCb1!)_HhhaWUYRqUy5GT^>C`REedO&0Yqft2 z%70*NbfFnZ-30B24SPr&QvZzpvNYd)@QiA!CC^V%L9V-6% zypZPI!h^(@a5=!z`7tMcN~Pyzl?n$>ViLH8aS>$1cjR@kKa<~+14P^e4N zo}_uP;B8whcy~=Dzi|dfZ=dmBV(T;3D1Xc9Jx)c_nLt_C>F?~X(ee{%UelCUknRMK zbVYgO;4#@wzmkkM(!4HV(yNKC-f3?LJK~#f0{E1*2SBuz<*h`0iOjqy)L)hlj@*6* z)vFTfmn*=0qh$U#`fnXc!~c(H{sH7iuRmZI;12)*0AzYpSaechcOYfF7004N}J&H>XfItXC_ng8bKui1_hcGVOx$yoG$;37^O&@aIPs-BrRk%C+ z@S$G*1z0M$RSkk#2MijulTEYe`4I+HYL59ZCz`zUI2TKV66VVQ00D)Q&jTEP(@LdO z9qb^*AwzYtASxnGQpF-zC~bvS9ZW9$f+h_~i;JV+T5#}VvFhOBtgC~oAP9bdI665g zx=4xtOA0MwJUH&hyL*qjcYx5WFxB*p1FBXtQt_CW&8>?5R|L=xAHtZGn5ieyiy63% zuX}j-dKcwc?&tm-eM;VBfJY>Mo@2UEBiF9F6jh^qA?vWhd5g1Jsk8Py`3r-2Z6(chn!|`= z2?-=2LPi~BR8T{dR*e)BDcX;@_`|k8NiLaOWiWCqpb8a|?FavZ-`$#jg~G?f^qix@1VU zT3B0I5-4GiL4~G-YKpHIvE*A0%NjFfnCgVmK{gIb}61G&nUmEn+t|I4w40G-Nh4 zWH2}}HDr?w2qz?FF=I7kH92D~He+HiEi^MZV=ZDfH8m|XGBz}0H8?ReWoBWMaR@{x zHZ?agGd4FcIWsUYF)$(uARr(|Nlj2XR%LQ?X>V>lA~G&9FfKAQlUN8Ili~=rBQs=X zW-~QqVJ$c?Vlgc=W@Te7IAl3yEo5XkFf=qUWH~Z5le-B>5Hc+>FfB1NR5CI;FflqY zFthRsXb68bxEFi?000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B z00(qQO+^Rh3JwJU3R$Bk82|tP8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X z4i^9b06$4YK~y-)V_+EafDwoIe-hQBX#7vE{C_(VTn<;uL}?f>Q9Drold6V^7E$}3 pLKosx_@5G&{HMe_{|9$w0sshq5cusnwT=J)002ovPDHLkV1n^wV?_V} delta 1876 zcmV-a2dntxC$%V$B!8ZIR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}?N?oz+bRrw zXBAxnk`RLBV1B;u?%*!J2iv%bCo|Jd`#2^BSr$h^N07wz|Nk5A2QK!)E~urLWAwN} z4w(ytA2nO#CGfpN6!+D z0A$|eq(I1fuP~g-A|h$;S5ABA>2YAugVUihnRBbF+sP2%)j+NcRM8!0;N3s(wFjS1kwjgUK08#|sieN~N<{0g^tbC|(W`PKmC48ZgHkr$ zWDA>aakDLLc`Fs=Q$y7ntJUOcuBCC4hI69DW-YbcN~exe>Y;0o-FoV|mw{3nGQ!Xi zhmADyC>Lww4qD%|-)D^$YrHcx4eeqLQ_U6x&41%WCud-c1A%dy44|NSa^@3-z;04E zIrEvZE0htXPI4Me#=v0c#5(BW?iX`UytxqmiZ@=&xk=r>V9rhI-eK-7Z!cJD^V_C+ zaXUkE8_uM9!S;hePlZ#NUuwTSx<8%p4fGB4WuQ^?64lBsd+8KT(HC}0_;8fowWW`5yj=>Em!9xjzf% zRaj9MkjhmqK|igi8s99U)<*6O{!{Kg<1*Ckq>8?qptlpX=|dzd5ckzc?xXu#fN!90 zppSs??_jiyzXm@6yB3sKC|+I$0004mlYImne^X0UDh_ri;*g;_Sr9GaC{-+ih0<1N z)xqS_FKA*&Qd}Gb*Mfr|i&X~~XI&j!1wrrw#Ldk~(M3x9Us7lhBS2#6pqF;h=v7jp0%U-$6w^)AMt+-n4Yi`@~^Zkrd){;&Fp6Nc_lk+2uFRWrqcx88&j6IpQ#}SnguEi&@1` ziQ~jkMb#)@$h)j?-r}s*>a2ZF{=!gETh4Nw<_MBlL<(t$kWoh!HCTwzs*z$ML;DF2 z|FGjvlS?L76^tD7*nkSj@q_=t?{3Y~f7GO#6iNVr7u)_A1%kUkt6|&U$F|)%0sPOv zmDcfZG=Z5<(idZ1G&VRnEnzY+I4v+SVP-WlG&f@~V`Gzf z2p=ReF)(E{H8nUbI59LbEi^YcI4wD1H8L$_HZwFgV>dT4WH~mIya*>fH#9diFf=tZ zEj2b~I4v|`HaIOfGB-IbVK_NuVl*>1G%;jkA_^cNAY@}YMsIR$VRStrX>DO=WiN1U zXOjmBL=H1BI5RXiF)=wXHZe3glUWHLlaUFwBRFDWH!w9cVl6p0I4~_VF=a6=VKrej zEn;CgG%++bHe_QolWGb`5-}|>I4v?ZR53F;GBr9dFd{FLt$l7HYQIi6+ig zQ_k1&zXHI^vk+0JYTVsbHHawwnweZVm^n^nW{%$b7V=p|A_4#a?hduqSj{2=?haMF^w^f!c+UpLwo@Xb6w9$FMBBf O0000nIHT zXBD#qOX9g4nMc*^V3vOyg6+gk&dGUv-5OH?EMuwZmT*k{@84$r!No+;SQnyC-Y>Xp zvWXRwxZJLF^t9N~&zohNJlM_tfMF7ha=T4D?G<*+Y2K$9gnzd6o1;CFV&;wqs?)wc z+Slojw>+kKvhe2U>=YbDRfcADbxvl7@lPr;(MyoBHr=8+d0 zz-Q?|Tjn$zxf`LoVY}a!GB9x!k_A1By`hx;W6^FOy_mib6BQ?6^fHKFASECGX_|p_ z*~z@;=HTeX^?%N`W}1vNFh^p{*(pEv*(p7OPP^Rfha=uG|0#mfthzKG~%WaE>lF_ z7s5)^dq!M7nz_IENxL{|t=A0E5_hhEi+dFUMpv%)SOr0-O-`Yx85Gk_^!?R^6)5Ni z%@G^aWxcsr9UZwPUFTl?4$UsN>ZVYp15kw64q!;2z~V_9d0GNo ziJapClz(hRJj6j2AU56!G}f}?n;EAkgmB_fl@S6d#In{QeS*bNo2)u<);Z^0aM2~F zUVN`G?}P8hum%Y>xZpzwF{GeTqKz*47-EbmYT_gY$FxhR#}rdastBs^taw|oLUrX; zR=c{@uVIaAS~Vkmvdu309CFMlYvCfMppc6%p?}1ZidL#frE06IzJ?lWs@jlhO`2`4 z`4(Disp+oTRP|A{vvMD+MpHE&LWw~acGX}GVRJ$KIB{JwD8`ncc<2fsp}A|eM6#B< zax1FF;JbsWa14~Li&Lm81_f;;c8zxJ4&|QeW^DYHZhThGbm@LWIn$*(DRqxR3}mq+v67yozkT}RMWhY|ma-W!ockKWAJ!(XFHQ8n{v zMY5mPi*D=q?5o;~cl?KZcQa+JJ0?9pR6{RGsCtT;-QMsUhuNP&8TN0B_Mw>Oob>q0To}X0;KlxO+7W%7oadu?mHVeO z=}$>7I1U)*cktXfy2rJLZjwGb8Gmp>e(LDS5&8us%r8;&7ddM9W0TAucR=&H3V)}j z;s5{uXL?jvbW&k=AaHVTW@&6?Aar?fWguyAbYlPjc-lRR!3}^g3mU^@74h8L#!kz#OK6g23?T&k?XRth7)?*grcWqlu8R_g@tJ_A=; z$6sv%GoPe4I$Goi7}y3bt~;8%2VCv|Lr=P7NVepqDHIC8`x$*x4j8-z0&7lh?R}g+ z02%6P`35*R1V)RLz3%ev-tON1J=5;*2d36?ye?61u>b%K7->{kbXZMHIIWYr zF)}haFfuhVEn#6~Vl6abH#03bWHVwdGiEq2Ha28pV>4tilPw4*Bw=MTGC5>7H7#K= zGBYhSWMMQdVq`NpEiqy+HZw6cVmUElIFpeGL?|{jH!?FcH#0akHZU_aA_^cNAV*0} zP&!s+a&u{KZapG0E-^4JGBlHT2p*FH3AQ9QIWjXaHa24|V>DwoEi^GQWGy)`VKXgc zF=aC~H!@^1V`epz+zCezGA%JMEip4xGBG+eH##*lvl0tv2!8@3jQs!r00v@9M??TY z04V?%xF9dT00009a7bBm001r{001r{0eGc9b^rhX2XskIMF-{z4g@(h`Iy}30000P zbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN+et)0R5;7klD%<+Fc3zc zEcd`Dqyh>c7Jm)Ug%Y)3$3)aa1%y;UKp-F>QbfW3+g7{<1fem8JkJ5>x{hU802qcL0*R~G7z1#M0{}Q70Tdu#cS}J$j^k54%d+GQ zzF&#MTWkFUyE;kEpeTy7qSl(GX#h}4MfQ^|lx2BV3RsnuQaI;u&P6TA>!Dw@c;;x VZ(P5ElhFVG002ovPDHLkV1gv(yzc-2 delta 1978 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 literal 0 HcmV?d00001