2015-06-02 16:53:02 +02:00
-- Mobs Api (29th May 2015)
2014-10-28 18:01:32 +01:00
mobs = { }
2014-11-01 14:51:14 +01:00
mobs.mod = " redo "
2015-02-25 01:57:21 +01:00
2015-03-02 22:29:17 +01:00
-- Do mobs spawn in protected areas (0=yes, 1=no)
2015-07-13 23:52:30 +02:00
mobs.protected = 0
2015-02-25 01:57:21 +01:00
2015-04-11 21:45:03 +02:00
-- Initial settings check
2015-02-25 01:57:21 +01:00
local damage_enabled = minetest.setting_getbool ( " enable_damage " )
local peaceful_only = minetest.setting_getbool ( " only_peaceful_mobs " )
2015-04-11 21:45:03 +02:00
local enable_blood = minetest.setting_getbool ( " mobs_enable_blood " ) or true
2014-12-15 00:17:29 +01:00
2014-10-28 18:01:32 +01:00
function mobs : register_mob ( name , def )
minetest.register_entity ( name , {
2015-05-22 10:37:17 +02:00
stepheight = def.stepheight or 0.6 ,
2014-10-28 18:01:32 +01:00
name = name ,
2015-05-22 10:37:17 +02:00
fly = def.fly ,
fly_in = def.fly_in or " air " ,
2015-04-02 19:16:47 +02:00
owner = def.owner ,
order = def.order or " " ,
2015-05-22 10:37:17 +02:00
on_die = def.on_die ,
jump_height = def.jump_height or 6 ,
jump_chance = def.jump_chance or 0 ,
rotate = def.rotate or 0 , -- 0=front, 1.5=side, 3.0=back, 4.5=side2
lifetimer = def.lifetimer or 600 ,
2014-11-01 14:51:14 +01:00
hp_min = def.hp_min or 5 ,
2015-03-18 21:28:40 +01:00
hp_max = def.hp_max or 10 ,
2014-10-28 18:01:32 +01:00
physical = true ,
collisionbox = def.collisionbox ,
visual = def.visual ,
2015-03-18 21:28:40 +01:00
visual_size = def.visual_size or { x = 1 , y = 1 } ,
2014-10-28 18:01:32 +01:00
mesh = def.mesh ,
2015-05-27 18:25:55 +02:00
makes_footstep_sound = def.makes_footstep_sound or false ,
2015-04-02 19:16:47 +02:00
view_range = def.view_range or 5 ,
2015-04-11 21:45:03 +02:00
walk_velocity = def.walk_velocity or 1 ,
run_velocity = def.run_velocity or 2 ,
2014-10-28 18:01:32 +01:00
damage = def.damage ,
light_damage = def.light_damage ,
water_damage = def.water_damage ,
lava_damage = def.lava_damage ,
2015-03-18 21:28:40 +01:00
fall_damage = def.fall_damage or 1 ,
2015-05-22 10:37:17 +02:00
fall_speed = def.fall_speed or - 10 , -- must be lower than -2 (default: -10)
2015-04-11 21:45:03 +02:00
drops = def.drops or { } ,
2014-10-28 18:01:32 +01:00
armor = def.armor ,
on_rightclick = def.on_rightclick ,
type = def.type ,
attack_type = def.attack_type ,
arrow = def.arrow ,
shoot_interval = def.shoot_interval ,
2015-03-02 22:29:17 +01:00
sounds = def.sounds or { } ,
2014-10-28 18:01:32 +01:00
animation = def.animation ,
2015-03-18 21:28:40 +01:00
follow = def.follow or " " ,
2014-10-28 18:01:32 +01:00
jump = def.jump or true ,
walk_chance = def.walk_chance or 50 ,
attacks_monsters = def.attacks_monsters or false ,
group_attack = def.group_attack or false ,
2015-03-02 22:29:17 +01:00
--fov = def.fov or 120,
2014-10-28 18:01:32 +01:00
passive = def.passive or false ,
recovery_time = def.recovery_time or 0.5 ,
2015-05-27 18:25:55 +02:00
knock_back = def.knock_back or 3 ,
2015-02-25 01:57:21 +01:00
blood_amount = def.blood_amount or 5 ,
2014-10-28 18:01:32 +01:00
blood_texture = def.blood_texture or " mobs_blood.png " ,
2014-11-01 14:51:14 +01:00
shoot_offset = def.shoot_offset or 0 ,
2015-02-25 01:57:21 +01:00
floats = def.floats or 1 , -- floats in water by default
2015-05-27 18:25:55 +02:00
replace_rate = def.replace_rate ,
replace_what = def.replace_what ,
replace_with = def.replace_with ,
replace_offset = def.replace_offset or 0 ,
2014-10-28 18:01:32 +01:00
timer = 0 ,
env_damage_timer = 0 , -- only if state = "attack"
attack = { player = nil , dist = nil } ,
state = " stand " ,
tamed = false ,
pause_timer = 0 ,
2015-03-18 21:28:40 +01:00
horny = false ,
hornytimer = 0 ,
child = false ,
2015-03-19 00:10:30 +01:00
gotten = false ,
2015-05-22 10:37:17 +02:00
owner = " " ,
2015-05-27 18:25:55 +02:00
health = 0 ,
2015-02-25 01:57:21 +01:00
2014-10-28 18:01:32 +01:00
do_attack = function ( self , player , dist )
if self.state ~= " attack " then
2015-05-22 10:37:17 +02:00
if math.random ( 0 , 100 ) < 90 and self.sounds . war_cry then
minetest.sound_play ( self.sounds . war_cry , { object = self.object } )
end
2014-10-28 18:01:32 +01:00
self.state = " attack "
self.attack . player = player
self.attack . dist = dist
end
end ,
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
set_velocity = function ( self , v )
2015-04-12 22:45:04 +02:00
if not v then v = 0 end
2015-04-11 21:45:03 +02:00
if def.drawtype and def.drawtype == " side " then self.rotate = 1.5 end
local yaw = self.object : getyaw ( ) + self.rotate
2014-10-28 18:01:32 +01:00
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 ,
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
get_velocity = function ( self )
local v = self.object : getvelocity ( )
return ( v.x ^ 2 + v.z ^ 2 ) ^ ( 0.5 )
end ,
2014-11-05 22:02:36 +01:00
--[[
2014-10-28 18:01:32 +01:00
in_fov = function ( self , pos )
-- checks if POS is in self's FOV
2015-04-11 21:45:03 +02:00
local yaw = self.object : getyaw ( ) + self.rotate
2014-10-28 18:01:32 +01:00
local vx = math.sin ( yaw )
local vz = math.cos ( yaw )
local ds = math.sqrt ( vx ^ 2 + vz ^ 2 )
local ps = math.sqrt ( pos.x ^ 2 + pos.z ^ 2 )
local d = { x = vx / ds , z = vz / ds }
local p = { x = pos.x / ps , z = pos.z / ps }
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
local an = ( d.x * p.x ) + ( d.z * p.z )
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
a = math.deg ( math.acos ( an ) )
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
if a > ( self.fov / 2 ) then
return false
else
return true
end
end ,
2014-11-05 22:02:36 +01:00
] ]
2014-10-28 18:01:32 +01:00
set_animation = function ( self , type )
if not self.animation then
return
end
if not self.animation . current then
self.animation . current = " "
end
if type == " stand " and self.animation . current ~= " stand " then
2015-03-18 21:28:40 +01:00
if self.animation . stand_start and self.animation . stand_end and self.animation . speed_normal then
2015-02-25 01:57:21 +01:00
self.object : set_animation ( { x = self.animation . stand_start ,
y = self.animation . stand_end } , self.animation . speed_normal , 0 )
2014-10-28 18:01:32 +01:00
self.animation . current = " stand "
end
elseif type == " walk " and self.animation . current ~= " walk " then
2015-03-18 21:28:40 +01:00
if self.animation . walk_start and self.animation . walk_end and self.animation . speed_normal then
2015-02-25 01:57:21 +01:00
self.object : set_animation ( { x = self.animation . walk_start , y = self.animation . walk_end } ,
self.animation . speed_normal , 0 )
2014-10-28 18:01:32 +01:00
self.animation . current = " walk "
end
elseif type == " run " and self.animation . current ~= " run " then
2015-03-18 21:28:40 +01:00
if self.animation . run_start and self.animation . run_end and self.animation . speed_run then
2015-02-25 01:57:21 +01:00
self.object : set_animation ( { x = self.animation . run_start , y = self.animation . run_end } ,
self.animation . speed_run , 0 )
2014-10-28 18:01:32 +01:00
self.animation . current = " run "
end
elseif type == " punch " and self.animation . current ~= " punch " then
2015-03-18 21:28:40 +01:00
if self.animation . punch_start and self.animation . punch_end and self.animation . speed_normal then
2015-02-25 01:57:21 +01:00
self.object : set_animation ( { x = self.animation . punch_start , y = self.animation . punch_end } ,
self.animation . speed_normal , 0 )
2014-10-28 18:01:32 +01:00
self.animation . current = " punch "
end
end
end ,
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
on_step = function ( self , dtime )
2015-02-25 01:57:21 +01:00
if self.type == " monster " and peaceful_only then
2014-10-28 18:01:32 +01:00
self.object : remove ( )
2015-04-11 21:45:03 +02:00
return
2014-10-28 18:01:32 +01:00
end
2015-04-11 21:45:03 +02:00
2015-05-27 18:25:55 +02:00
-- if lifetimer run out and not npc; tamed or attacking then remove mob
2015-04-11 21:45:03 +02:00
if self.type ~= " npc " and not self.tamed then
self.lifetimer = self.lifetimer - dtime
if self.lifetimer <= 0 and self.state ~= " attack " then
2015-05-27 18:25:55 +02:00
minetest.log ( " action " , " lifetimer expired, removed " .. self.name )
effect ( self.object : getpos ( ) , 15 , " tnt_smoke.png " )
self.object : remove ( )
return
2014-10-28 18:01:32 +01:00
end
end
2015-03-18 21:28:40 +01:00
-- check for mob drop/replace (used for chicken egg and sheep eating grass/wheat)
2015-05-27 18:25:55 +02:00
if self.replace_rate
and self.child == false
and math.random ( 1 , self.replace_rate ) == 1 then
local pos = self.object : getpos ( )
pos.y = pos.y + self.replace_offset
if self.replace_what
and self.object : getvelocity ( ) . y == 0
and # minetest.find_nodes_in_area ( pos , pos , self.replace_what ) > 0 then
--and self.state == "stand" then
minetest.set_node ( pos , { name = self.replace_with } )
2014-10-28 18:01:32 +01:00
end
end
2015-02-25 01:57:21 +01:00
2015-05-27 18:25:55 +02:00
local yaw = 0
2015-04-20 23:12:05 +02:00
-- jump direction (adapted from Carbone mobs), gravity, falling or floating in water
2015-05-22 10:37:17 +02:00
if not self.fly then
if self.object : getvelocity ( ) . y > 0.1 then
2015-05-27 18:25:55 +02:00
yaw = self.object : getyaw ( ) + self.rotate
2015-05-22 10:37:17 +02:00
local x = math.sin ( yaw ) * - 2
local z = math.cos ( yaw ) * 2
if minetest.get_item_group ( minetest.get_node ( self.object : getpos ( ) ) . name , " water " ) ~= 0 then
if self.floats == 1 then self.object : setacceleration ( { x = x , y = 1.5 , z = z } ) end
else
self.object : setacceleration ( { x = x , y = self.fall_speed , z = z } )
end
2015-04-20 23:12:05 +02:00
else
2015-05-22 10:37:17 +02:00
if minetest.get_item_group ( minetest.get_node ( self.object : getpos ( ) ) . name , " water " ) ~= 0 then
if self.floats == 1 then self.object : setacceleration ( { x = 0 , y = 1.5 , z = 0 } ) end
else
self.object : setacceleration ( { x = 0 , y = self.fall_speed , z = 0 } )
end
2015-04-20 23:12:05 +02:00
end
2014-11-05 22:02:36 +01:00
2015-05-22 10:37:17 +02:00
-- fall damage
if self.fall_damage == 1 and self.object : getvelocity ( ) . y == 0 then
local d = self.old_y - self.object : getpos ( ) . y
if d > 5 then
self.object : set_hp ( self.object : get_hp ( ) - math.floor ( d - 5 ) )
2015-05-27 18:25:55 +02:00
effect ( self.object : getpos ( ) , 5 , " tnt_smoke.png " )
2015-05-22 10:37:17 +02:00
check_for_death ( self )
end
self.old_y = self.object : getpos ( ) . y
2014-10-28 18:01:32 +01:00
end
end
2015-05-22 19:28:57 +02:00
2015-04-20 23:12:05 +02:00
-- knockback timer
2014-10-28 18:01:32 +01:00
if self.pause_timer > 0 then
self.pause_timer = self.pause_timer - dtime
2015-03-02 22:29:17 +01:00
if self.pause_timer < 1 then
2014-10-28 18:01:32 +01:00
self.pause_timer = 0
end
return
end
2015-05-22 19:28:57 +02:00
2015-04-11 21:45:03 +02:00
-- attack timer
2015-02-25 01:57:21 +01:00
self.timer = self.timer + dtime
2014-10-28 18:01:32 +01:00
if self.state ~= " attack " then
if self.timer < 1 then
return
end
self.timer = 0
end
2014-11-05 22:02:36 +01:00
2015-04-11 21:45:03 +02:00
if self.sounds . random and math.random ( 1 , 100 ) <= 1 then
2014-10-28 18:01:32 +01:00
minetest.sound_play ( self.sounds . random , { object = self.object } )
end
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
local do_env_damage = function ( self )
2015-02-25 01:57:21 +01:00
2014-10-28 18:01:32 +01:00
local pos = self.object : getpos ( )
local n = minetest.get_node ( pos )
2015-02-25 01:57:21 +01:00
local tod = minetest.get_timeofday ( )
2015-05-27 18:09:26 +02:00
pos.y = ( pos.y + self.collisionbox [ 2 ] ) -- foot level
--print ("standing on:", minetest.get_node(pos).name)
2014-10-28 18:01:32 +01:00
if self.light_damage and self.light_damage ~= 0
2015-02-25 01:57:21 +01:00
and pos.y > 0
2015-05-22 10:37:17 +02:00
and tod > 0.2 and tod < 0.8
and ( minetest.get_node_light ( pos ) or 0 ) > 10 then
2015-03-18 21:28:40 +01:00
self.object : set_hp ( self.object : get_hp ( ) - self.light_damage )
effect ( pos , 5 , " tnt_smoke.png " )
2015-05-27 18:25:55 +02:00
check_for_death ( self )
2014-10-28 18:01:32 +01:00
end
2014-11-05 22:02:36 +01:00
2015-02-25 01:57:21 +01:00
if self.water_damage and self.water_damage ~= 0
and minetest.get_item_group ( n.name , " water " ) ~= 0 then
2015-03-18 21:28:40 +01:00
self.object : set_hp ( self.object : get_hp ( ) - self.water_damage )
effect ( pos , 5 , " bubble.png " )
2015-05-27 18:25:55 +02:00
check_for_death ( self )
2014-10-28 18:01:32 +01:00
end
2015-05-22 19:28:57 +02:00
2015-02-25 01:57:21 +01:00
if self.lava_damage and self.lava_damage ~= 0
and minetest.get_item_group ( n.name , " lava " ) ~= 0 then
2015-03-18 21:28:40 +01:00
self.object : set_hp ( self.object : get_hp ( ) - self.lava_damage )
effect ( pos , 5 , " fire_basic_flame.png " )
2015-05-27 18:25:55 +02:00
check_for_death ( self )
2015-02-25 01:57:21 +01:00
end
2014-10-28 18:01:32 +01:00
end
2015-05-22 19:28:57 +02:00
2015-04-11 21:45:03 +02:00
local do_jump = function ( self )
2015-05-22 10:37:17 +02:00
if self.fly then return end
self.jumptimer = ( self.jumptimer or 0 ) + 1
if self.jumptimer < 3 then
local pos = self.object : getpos ( )
pos.y = ( pos.y + self.collisionbox [ 2 ] ) - 0.2
local nod = minetest.get_node ( pos )
2015-05-27 18:09:26 +02:00
--print ("standing on:", nod.name, pos.y)
2015-05-22 10:37:17 +02:00
if not nod or not minetest.registered_nodes [ nod.name ]
or minetest.registered_nodes [ nod.name ] . walkable == false then return end
if self.direction then
2015-06-02 16:53:02 +02:00
pos.y = pos.y + 0.5
2015-05-22 10:37:17 +02:00
local nod = minetest.get_node_or_nil ( { x = pos.x + self.direction . x , y = pos.y , z = pos.z + self.direction . z } )
2015-05-27 18:09:26 +02:00
--print ("in front:", nod.name, pos.y)
2015-05-22 10:37:17 +02:00
if nod and nod.name and ( nod.name ~= " air " or self.walk_chance == 0 ) then
local def = minetest.registered_items [ nod.name ]
if ( def and def.walkable and not nod.name : find ( " fence " ) ) or self.walk_chance == 0 then
local v = self.object : getvelocity ( )
v.y = self.jump_height + 1
v.x = v.x * 2.2
v.z = v.z * 2.2
self.object : setvelocity ( v )
if self.sounds . jump then
minetest.sound_play ( self.sounds . jump , { object = self.object } )
end
2015-04-12 22:45:04 +02:00
end
end
end
2015-05-22 10:37:17 +02:00
else
self.jumptimer = 0
2015-04-11 21:45:03 +02:00
end
end
2015-05-22 19:28:57 +02:00
2015-04-11 21:45:03 +02:00
-- environmental damage timer
2014-10-28 18:01:32 +01:00
self.env_damage_timer = self.env_damage_timer + dtime
if self.state == " attack " and self.env_damage_timer > 1 then
self.env_damage_timer = 0
do_env_damage ( self )
elseif self.state ~= " attack " then
do_env_damage ( self )
end
2015-05-22 19:28:57 +02:00
2015-04-11 21:45:03 +02:00
-- find someone to attack
2015-03-18 21:28:40 +01:00
if self.type == " monster " and damage_enabled and self.state ~= " attack " then
2015-02-25 01:57:21 +01:00
2014-10-28 18:01:32 +01:00
local s = self.object : getpos ( )
2015-04-27 22:38:49 +02:00
local p , sp , dist
2014-10-28 18:01:32 +01:00
local player = nil
local type = nil
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
local obj = nil
2015-04-27 22:38:49 +02:00
local min_dist = self.view_range + 1
local min_player = nil
2015-02-25 01:57:21 +01:00
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
for _ , oir in ipairs ( minetest.get_objects_inside_radius ( s , self.view_range ) ) do
2015-02-25 01:57:21 +01:00
2014-10-28 18:01:32 +01:00
if oir : is_player ( ) then
player = oir
type = " player "
else
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
obj = oir : get_luaentity ( )
2014-10-28 18:01:32 +01:00
if obj then
player = obj.object
type = obj.type
end
end
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
if type == " player " or type == " npc " then
2015-05-22 10:37:17 +02:00
s = self.object : getpos ( )
p = player : getpos ( )
sp = s
2014-10-28 18:01:32 +01:00
p.y = p.y + 1
sp.y = sp.y + 1 -- aim higher to make looking up hills more realistic
2015-05-22 10:37:17 +02:00
dist = ( ( p.x - s.x ) ^ 2 + ( p.y - s.y ) ^ 2 + ( p.z - s.z ) ^ 2 ) ^ 0.5
2014-11-05 22:02:36 +01:00
if dist < self.view_range then -- and self.in_fov(self,p) then
2015-04-27 22:38:49 +02:00
-- choose closest player to attack
if minetest.line_of_sight ( sp , p , 2 ) == true
and dist < min_dist then
min_dist = dist
min_player = player
2014-10-28 18:01:32 +01:00
end
end
end
end
2015-04-27 22:38:49 +02:00
-- attack player
if min_player then
self.do_attack ( self , min_player , min_dist )
end
2014-10-28 18:01:32 +01:00
end
2015-05-22 19:28:57 +02:00
2015-04-27 22:38:49 +02:00
-- npc, find closest monster to attack
local min_dist = self.view_range + 1
local min_player = nil
2015-03-18 21:28:40 +01:00
if self.type == " npc " and self.attacks_monsters and self.state ~= " attack " then
local s = self.object : getpos ( )
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
local obj = nil
for _ , oir in pairs ( minetest.get_objects_inside_radius ( s , self.view_range ) ) do
obj = oir : get_luaentity ( )
2015-03-18 21:28:40 +01:00
if obj and obj.type == " monster " then
-- attack monster
2015-06-22 18:47:20 +02:00
local p = obj.object : getpos ( )
local dist = ( ( p.x - s.x ) ^ 2 + ( p.y - s.y ) ^ 2 + ( p.z - s.z ) ^ 2 ) ^ 0.5
2015-04-27 22:38:49 +02:00
if dist < min_dist then
min_dist = dist
min_player = obj.object
end
2015-03-18 21:28:40 +01:00
end
end
2015-04-27 22:38:49 +02:00
if min_player then
self.do_attack ( self , min_player , min_dist )
end
2015-03-18 21:28:40 +01:00
end
2014-10-28 18:01:32 +01:00
2015-03-26 20:08:30 +01:00
-- horny animal can mate for 40 seconds, afterwards horny animal cannot mate again for 200 seconds
if self.horny == true and self.hornytimer < 240 and self.child == false then
2015-03-18 21:28:40 +01:00
self.hornytimer = self.hornytimer + 1
2015-03-26 20:08:30 +01:00
if self.hornytimer >= 240 then
2015-03-18 21:28:40 +01:00
self.hornytimer = 0
self.horny = false
end
end
2015-03-26 20:08:30 +01:00
-- if animal is child take 240 seconds before growing into adult
2015-03-18 21:28:40 +01:00
if self.child == true then
self.hornytimer = self.hornytimer + 1
2015-03-26 20:08:30 +01:00
if self.hornytimer > 240 then
2015-03-18 21:28:40 +01:00
self.child = false
self.hornytimer = 0
self.object : set_properties ( {
2015-03-19 00:10:30 +01:00
textures = self.base_texture ,
mesh = self.base_mesh ,
2015-03-18 21:28:40 +01:00
visual_size = { x = self.visual_size . x , y = self.visual_size . y } ,
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
collisionbox = self.collisionbox ,
2015-03-18 21:28:40 +01:00
} )
end
end
-- if animal is horny, find another same animal who is horny and mate
if self.horny == true and self.hornytimer <= 40 then
2015-05-27 18:25:55 +02:00
local pos = self.object : getpos ( )
effect ( { x = pos.x , y = pos.y + 1 , z = pos.z } , 4 , " heart.png " )
2015-03-18 21:28:40 +01:00
local ents = minetest.get_objects_inside_radius ( pos , self.view_range )
local num = 0
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
local ent = nil
2015-03-18 21:28:40 +01:00
for i , obj in ipairs ( ents ) do
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
ent = obj : get_luaentity ( )
2015-03-18 21:28:40 +01:00
if ent and ent.name == self.name and ent.horny == true and ent.hornytimer <= 40 then num = num + 1 end
if num > 1 then
2015-04-11 21:45:03 +02:00
self.hornytimer = 41
ent.hornytimer = 41
2015-03-18 21:28:40 +01:00
minetest.after ( 7 , function ( dtime )
local mob = minetest.add_entity ( pos , self.name )
local ent2 = mob : get_luaentity ( )
2015-03-25 17:25:54 +01:00
local textures = self.base_texture
2015-03-19 00:10:30 +01:00
if def.child_texture then
textures = def.child_texture [ 1 ]
end
2015-03-18 21:28:40 +01:00
mob : set_properties ( {
2015-03-19 00:10:30 +01:00
textures = textures ,
2015-03-18 21:28:40 +01:00
visual_size = { x = self.visual_size . x / 2 , y = self.visual_size . y / 2 } ,
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
collisionbox = { self.collisionbox [ 1 ] / 2 , self.collisionbox [ 2 ] / 2 , self.collisionbox [ 3 ] / 2 ,
self.collisionbox [ 4 ] / 2 , self.collisionbox [ 5 ] / 2 , self.collisionbox [ 6 ] / 2 } ,
2015-03-18 21:28:40 +01:00
} )
ent2.child = true
ent2.tamed = true
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
ent2.following = ent -- follow mother
2015-03-18 21:28:40 +01:00
end )
num = 0
break
end
end
end
2015-04-11 21:45:03 +02:00
-- find player to follow
2015-04-02 19:16:47 +02:00
if ( self.follow ~= " " or self.order == " follow " ) and not self.following and self.state ~= " attack " then
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
local s , p , dist
for _ , player in pairs ( minetest.get_connected_players ( ) ) do
s = self.object : getpos ( )
p = player : getpos ( )
dist = ( ( p.x - s.x ) ^ 2 + ( p.y - s.y ) ^ 2 + ( p.z - s.z ) ^ 2 ) ^ 0.5
2015-04-02 19:16:47 +02:00
if dist < self.view_range then
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
self.following = player
break
end
end
end
2015-07-14 20:27:36 +02:00
if self.type == " npc " and self.order == " follow " and self.owner and self.owner ~= " " and self.state ~= " attack " then --/MFF (Crabman|07/14/2015) follow diamond if has not owner
2015-04-02 19:16:47 +02:00
-- npc stop following player if not owner
2015-07-14 16:38:50 +02:00
if self.following and self.owner and self.owner ~= self.following : get_player_name ( ) then
2015-04-02 19:16:47 +02:00
self.following = nil
end
else
-- stop following player if not holding specific item
if self.following and self.following . is_player and self.following : get_wielded_item ( ) : get_name ( ) ~= self.follow then
self.following = nil
end
2015-03-26 20:08:30 +01:00
end
2015-04-11 21:45:03 +02:00
-- follow player or mob
2015-03-26 20:08:30 +01:00
if self.following then
2015-04-02 19:16:47 +02:00
local s = self.object : getpos ( )
local p
if self.following . is_player and self.following : is_player ( ) then
2015-03-26 20:08:30 +01:00
p = self.following : getpos ( )
elseif self.following . object then
p = self.following . object : getpos ( )
2015-04-02 19:16:47 +02:00
end
2015-03-26 20:08:30 +01:00
if p then
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
self.following = nil
else
local vec = { x = p.x - s.x , y = p.y - s.y , z = p.z - s.z }
2015-05-27 18:25:55 +02:00
yaw = ( math.atan ( vec.z / vec.x ) + math.pi / 2 ) + self.rotate -- local
2015-03-26 20:08:30 +01:00
if p.x > s.x then
yaw = yaw + math.pi
end
self.object : setyaw ( yaw )
2015-04-02 19:16:47 +02:00
-- anyone but standing npc's can move along
2015-07-14 20:27:36 +02:00
if dist > 4 and self.order ~= " stand " then --/MFF (Crabman|07/14/2015) follow but at distance
2015-04-11 21:45:03 +02:00
if ( self.jump and self.get_velocity ( self ) <= 0.5 and self.object : getvelocity ( ) . y == 0 )
2015-05-27 18:25:55 +02:00
or ( self.object : getvelocity ( ) . y == 0 and self.jump_chance > 0 ) then
2015-04-12 22:45:04 +02:00
self.direction = { x = math.sin ( yaw ) *- 1 , y = - 20 , z = math.cos ( yaw ) }
2015-04-11 21:45:03 +02:00
do_jump ( self )
end
self.set_velocity ( self , self.walk_velocity )
if self.walk_chance ~= 0 then
self : set_animation ( " walk " )
2015-03-26 20:08:30 +01:00
end
else
self.set_velocity ( self , 0 )
self : set_animation ( " stand " )
end
return
end
end
end
2014-10-28 18:01:32 +01:00
if self.state == " stand " then
-- randomly turn
if math.random ( 1 , 4 ) == 1 then
-- if there is a player nearby look at them
local lp = nil
local s = self.object : getpos ( )
2015-02-25 01:57:21 +01:00
2014-10-28 18:01:32 +01:00
if self.type == " npc " then
local o = minetest.get_objects_inside_radius ( self.object : getpos ( ) , 3 )
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
local yaw = 0
for _ , o in ipairs ( o ) do
if o : is_player ( ) then
lp = o : getpos ( )
break
end
end
end
2015-02-25 01:57:21 +01:00
2014-10-28 18:01:32 +01:00
if lp ~= nil then
local vec = { x = lp.x - s.x , y = lp.y - s.y , z = lp.z - s.z }
2015-04-11 21:45:03 +02:00
yaw = ( math.atan ( vec.z / vec.x ) + math.pi / 2 ) + self.rotate
2014-10-28 18:01:32 +01:00
if lp.x > s.x then
yaw = yaw + math.pi
end
2015-05-22 19:28:57 +02:00
else
2014-10-28 18:01:32 +01:00
yaw = self.object : getyaw ( ) + ( ( math.random ( 0 , 360 ) - 180 ) / 180 * math.pi )
end
self.object : setyaw ( yaw )
end
2015-02-25 01:57:21 +01:00
2014-10-28 18:01:32 +01:00
self.set_velocity ( self , 0 )
self.set_animation ( self , " stand " )
2015-02-25 01:57:21 +01:00
2015-04-02 19:16:47 +02:00
-- npc's ordered to stand stay standing
if self.type == " npc " and self.order == " stand " then
self.set_velocity ( self , 0 )
self.state = " stand "
self : set_animation ( " stand " )
else
2015-04-11 21:45:03 +02:00
if self.walk_chance ~= 0 and math.random ( 1 , 100 ) <= self.walk_chance then
2015-04-02 19:16:47 +02:00
self.set_velocity ( self , self.walk_velocity )
self.state = " walk "
self.set_animation ( self , " walk " )
end
2015-04-11 21:45:03 +02:00
-- jumping mobs only
2015-05-22 10:37:17 +02:00
-- if self.jump and math.random(1, 100) <= self.jump_chance then
-- self.direction = {x=0, y=0, z=0}
-- do_jump(self)
-- self.set_velocity(self, self.walk_velocity)
-- end
2014-10-28 18:01:32 +01:00
end
2015-02-25 01:57:21 +01:00
2014-10-28 18:01:32 +01:00
elseif self.state == " walk " then
2015-04-20 23:12:05 +02:00
local s = self.object : getpos ( )
2015-05-27 18:25:55 +02:00
local lp = minetest.find_node_near ( s , 1 , { " group:water " } )
-- if water nearby then turn away
if lp then
2015-04-20 23:12:05 +02:00
local vec = { x = lp.x - s.x , y = lp.y - s.y , z = lp.z - s.z }
yaw = math.atan ( vec.z / vec.x ) + 3 * math.pi / 2 + self.rotate
if lp.x > s.x then
yaw = yaw + math.pi
end
self.object : setyaw ( yaw )
2015-05-27 18:25:55 +02:00
-- otherwise randomly turn
2015-04-20 23:12:05 +02:00
elseif math.random ( 1 , 100 ) <= 30 then
2014-10-28 18:01:32 +01:00
self.object : setyaw ( self.object : getyaw ( ) + ( ( math.random ( 0 , 360 ) - 180 ) / 180 * math.pi ) )
end
if self.jump and self.get_velocity ( self ) <= 0.5 and self.object : getvelocity ( ) . y == 0 then
2015-04-12 22:45:04 +02:00
self.direction = { x = math.sin ( yaw ) *- 1 , y = - 20 , z = math.cos ( yaw ) }
2015-04-11 21:45:03 +02:00
do_jump ( self )
2014-10-28 18:01:32 +01:00
end
2015-04-11 21:45:03 +02:00
2014-10-28 18:01:32 +01:00
self : set_animation ( " walk " )
self.set_velocity ( self , self.walk_velocity )
2014-12-25 18:34:34 +01:00
if math.random ( 1 , 100 ) <= 30 then
2014-10-28 18:01:32 +01:00
self.set_velocity ( self , 0 )
self.state = " stand "
self : set_animation ( " stand " )
end
2015-04-20 23:12:05 +02:00
2015-04-27 22:38:49 +02:00
-- exploding mobs
2015-05-22 19:28:57 +02:00
elseif self.state == " attack " and self.attack_type == " explode " then
2015-03-12 04:29:19 +01:00
if not self.attack . player or not self.attack . player : is_player ( ) then
self.state = " stand "
self : set_animation ( " stand " )
self.timer = 0
self.blinktimer = 0
return
end
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.timer = 0
self.blinktimer = 0
self.attack = { player = nil , dist = nil }
self : set_animation ( " stand " )
return
else
self : set_animation ( " walk " )
self.attack . dist = dist
end
2015-05-22 19:28:57 +02:00
2015-03-12 04:29:19 +01:00
local vec = { x = p.x - s.x , y = p.y - s.y , z = p.z - s.z }
2015-05-27 18:25:55 +02:00
yaw = math.atan ( vec.z / vec.x ) + math.pi / 2 + self.rotate -- local
2015-03-12 04:29:19 +01:00
if p.x > s.x then
yaw = yaw + math.pi
end
self.object : setyaw ( yaw )
if self.attack . dist > 3 then
if not self.v_start then
self.v_start = true
self.set_velocity ( self , self.run_velocity )
self.timer = 0
2015-04-20 23:12:05 +02:00
self.blinktimer = 0
2015-03-12 04:29:19 +01:00
else
self.timer = 0
self.blinktimer = 0
2015-04-21 11:54:43 +02:00
if self.get_velocity ( self ) <= 0.5 and self.object : getvelocity ( ) . y == 0 then
2015-03-12 04:29:19 +01:00
local v = self.object : getvelocity ( )
v.y = 5
self.object : setvelocity ( v )
end
self.set_velocity ( self , self.run_velocity )
end
self : set_animation ( " run " )
else
self.set_velocity ( self , 0 )
self.timer = self.timer + dtime
2015-03-12 21:36:10 +01:00
self.blinktimer = ( self.blinktimer or 0 ) + dtime
2015-04-27 22:38:49 +02:00
if self.blinktimer > 0.2 then
self.blinktimer = 0
if self.blinkstatus then
self.object : settexturemod ( " " )
else
self.object : settexturemod ( " ^[brighten " )
2015-03-12 04:29:19 +01:00
end
2015-04-27 22:38:49 +02:00
self.blinkstatus = not self.blinkstatus
end
if self.timer > 3 then
local pos = vector.round ( self.object : getpos ( ) )
2015-06-24 15:20:27 +02:00
entity_physics ( pos , 3 , self ) -- hurt player/mobs caught in blast area --/MFF (Crabman|06/23/2015)add self to use punch function
2015-04-27 22:38:49 +02:00
if minetest.find_node_near ( pos , 1 , { " group:water " } )
or minetest.is_protected ( pos , " " ) then
2015-04-21 11:54:43 +02:00
self.object : remove ( )
2015-04-27 22:38:49 +02:00
if self.sounds . explode ~= " " then
minetest.sound_play ( self.sounds . explode , { pos = pos , gain = 1.0 , max_hear_distance = 16 } )
end
pos.y = pos.y + 1
effect ( pos , 15 , " tnt_smoke.png " , 5 )
return
2015-03-12 04:29:19 +01:00
end
2015-04-27 22:38:49 +02:00
self.object : remove ( )
mobs : explosion ( pos , 2 , 0 , 1 , " tnt_explode " , self.sounds . explode )
end
2015-03-12 04:29:19 +01:00
end
2015-04-27 22:38:49 +02:00
-- end of exploding mobs
2015-04-20 23:12:05 +02:00
2014-10-28 18:01:32 +01:00
elseif self.state == " attack " and self.attack_type == " dogfight " then
if not self.attack . player or not self.attack . player : getpos ( ) then
print ( " stop attacking " )
self.state = " stand "
self : set_animation ( " stand " )
return
end
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
2015-05-22 10:37:17 +02:00
2015-05-27 18:25:55 +02:00
-- fly bit modified from BlockMens creatures mod
if self.fly and dist > 2 then
local nod = minetest.get_node_or_nil ( s )
local p1 = s
local me_y = math.floor ( p1.y )
local p2 = p
local p_y = math.floor ( p2.y + 1 )
local v = self.object : getvelocity ( )
if nod and nod.name == self.fly_in then
if me_y < p_y then
self.object : setvelocity ( { x = v.x , y = 1 * self.walk_velocity , z = v.z } )
elseif me_y > p_y then
self.object : setvelocity ( { x = v.x , y =- 1 * self.walk_velocity , z = v.z } )
end
else
if me_y < p_y then
self.object : setvelocity ( { x = v.x , y = 0.01 , z = v.z } )
elseif me_y > p_y then
self.object : setvelocity ( { x = v.x , y =- 0.01 , z = v.z } )
end
end
2015-05-22 10:37:17 +02:00
2015-05-27 18:25:55 +02:00
end
-- end fly bit
2015-05-22 10:37:17 +02:00
2014-10-28 18:01:32 +01:00
if dist > self.view_range or self.attack . player : get_hp ( ) <= 0 then
self.state = " stand "
self.set_velocity ( self , 0 )
self.attack = { player = nil , dist = nil }
self : set_animation ( " stand " )
return
else
self.attack . dist = dist
end
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
local vec = { x = p.x - s.x , y = p.y - s.y , z = p.z - s.z }
2015-05-27 18:25:55 +02:00
yaw = ( math.atan ( vec.z / vec.x ) + math.pi / 2 ) + self.rotate -- local
2014-10-28 18:01:32 +01:00
if p.x > s.x then
yaw = yaw + math.pi
end
self.object : setyaw ( yaw )
2015-04-27 22:38:49 +02:00
-- attack distance is 2 + half of mob width so the bigger mobs can attack (like slimes)
2015-05-22 10:37:17 +02:00
if self.attack . dist > ( ( - self.collisionbox [ 1 ] + self.collisionbox [ 4 ] ) / 2 ) + 2 then
2015-04-11 21:45:03 +02:00
-- jump attack
if ( self.jump and self.get_velocity ( self ) <= 0.5 and self.object : getvelocity ( ) . y == 0 )
or ( self.object : getvelocity ( ) . y == 0 and self.jump_chance > 0 ) then
2015-04-12 22:45:04 +02:00
self.direction = { x = math.sin ( yaw ) *- 1 , y = - 20 , z = math.cos ( yaw ) }
2015-04-11 21:45:03 +02:00
do_jump ( self )
2014-10-28 18:01:32 +01:00
end
2015-04-11 21:45:03 +02:00
self.set_velocity ( self , self.run_velocity )
2014-10-28 18:01:32 +01:00
self : set_animation ( " run " )
else
self.set_velocity ( self , 0 )
self : set_animation ( " punch " )
if self.timer > 1 then
self.timer = 0
local p2 = p
local s2 = s
p2.y = p2.y + 1.5
s2.y = s2.y + 1.5
if minetest.line_of_sight ( p2 , s2 ) == true then
2015-04-11 21:45:03 +02:00
if self.sounds . attack then
2014-10-28 18:01:32 +01:00
minetest.sound_play ( self.sounds . attack , { object = self.object } )
end
self.attack . player : punch ( self.object , 1.0 , {
full_punch_interval = 1.0 ,
damage_groups = { fleshy = self.damage }
} , vec )
2014-12-25 18:34:34 +01:00
if self.attack . player : get_hp ( ) <= 0 then
2014-10-28 18:01:32 +01:00
self.state = " stand "
self : set_animation ( " stand " )
end
end
end
end
2015-02-25 01:57:21 +01:00
2014-10-28 18:01:32 +01:00
elseif self.state == " attack " and self.attack_type == " shoot " then
2015-02-25 01:57:21 +01:00
2014-10-28 18:01:32 +01:00
if not self.attack . player or not self.attack . player : is_player ( ) then
self.state = " stand "
self : set_animation ( " stand " )
return
end
local s = self.object : getpos ( )
local p = self.attack . player : getpos ( )
p.y = p.y - .5
s.y = s.y + .5
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.set_velocity ( self , 0 )
if self.type ~= " npc " then
self.attack = { player = nil , dist = nil }
end
self : set_animation ( " stand " )
return
else
self.attack . dist = dist
end
2015-05-22 19:28:57 +02:00
2014-10-28 18:01:32 +01:00
local vec = { x = p.x - s.x , y = p.y - s.y , z = p.z - s.z }
2015-05-27 18:25:55 +02:00
yaw = ( math.atan ( vec.z / vec.x ) + math.pi / 2 ) + self.rotate -- local
2014-10-28 18:01:32 +01:00
if p.x > s.x then
yaw = yaw + math.pi
end
self.object : setyaw ( yaw )
self.set_velocity ( self , 0 )
2015-05-22 19:28:57 +02:00
2015-04-11 21:45:03 +02:00
if self.shoot_interval and self.timer > self.shoot_interval and math.random ( 1 , 100 ) <= 60 then
2014-10-28 18:01:32 +01:00
self.timer = 0
self : set_animation ( " punch " )
2015-04-11 21:45:03 +02:00
if self.sounds . attack then
2014-10-28 18:01:32 +01:00
minetest.sound_play ( self.sounds . attack , { object = self.object } )
end
local p = self.object : getpos ( )
p.y = p.y + ( self.collisionbox [ 2 ] + self.collisionbox [ 5 ] ) / 2
local obj = minetest.add_entity ( p , self.arrow )
local amount = ( vec.x ^ 2 + vec.y ^ 2 + vec.z ^ 2 ) ^ 0.5
local v = obj : get_luaentity ( ) . velocity
2015-02-25 01:57:21 +01:00
vec.y = vec.y + self.shoot_offset -- this makes shoot aim accurate
2014-10-28 18:01:32 +01:00
vec.x = vec.x * v / amount
vec.y = vec.y * v / amount
vec.z = vec.z * v / amount
obj : setvelocity ( vec )
end
end
end ,
on_activate = function ( self , staticdata , dtime_s )
2015-05-27 18:25:55 +02:00
if self.type == " monster " and peaceful_only then
self.object : remove ( )
end
self.health = math.random ( self.hp_min , self.hp_max ) -- set initial HP
self.object : set_hp ( self.health )
self.health = self.object : get_hp ( )
2014-10-28 18:01:32 +01:00
self.object : set_armor_groups ( { fleshy = self.armor } )
2015-03-18 21:28:40 +01:00
self.object : setacceleration ( { x = 0 , y = self.fall_speed , z = 0 } )
2014-10-28 18:01:32 +01:00
self.state = " stand "
2015-05-22 10:37:17 +02:00
self.object : setvelocity ( { x = 0 , y = self.object : getvelocity ( ) . y , z = 0 } )
self.old_y = self.object : getpos ( ) . y
2014-10-28 18:01:32 +01:00
self.object : setyaw ( math.random ( 1 , 360 ) / 180 * math.pi )
2015-04-12 22:45:04 +02:00
2014-10-28 18:01:32 +01:00
if staticdata then
local tmp = minetest.deserialize ( staticdata )
2015-02-25 01:57:21 +01:00
if tmp then
if tmp.lifetimer then
2015-04-12 22:45:04 +02:00
self.lifetimer = tmp.lifetimer
2015-02-25 01:57:21 +01:00
end
if tmp.tamed then
self.tamed = tmp.tamed
end
2015-03-19 00:10:30 +01:00
if tmp.gotten then
2015-02-25 01:57:21 +01:00
self.gotten = tmp.gotten
end
2015-03-18 21:28:40 +01:00
if tmp.child then
self.child = tmp.child
end
if tmp.horny then
self.horny = tmp.horny
end
if tmp.hornytimer then
self.hornytimer = tmp.hornytimer
end
2015-03-19 00:10:30 +01:00
if tmp.textures then
self.textures = tmp.textures
end
if tmp.mesh then
self.mesh = tmp.mesh
end
if tmp.base_texture then
self.base_texture = tmp.base_texture
end
if tmp.base_mesh then
self.base_mesh = tmp.base_mesh
end
2015-05-22 10:37:17 +02:00
if tmp.owner then
self.owner = tmp.owner
end
2015-05-27 18:25:55 +02:00
if tmp.health then
self.health = tmp.health
self.object : set_hp ( self.health )
end
2014-10-28 18:01:32 +01:00
end
end
end ,
get_staticdata = function ( self )
2015-03-19 00:10:30 +01:00
-- select random texture, set model
if not self.base_texture then
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
self.base_texture = def.textures [ math.random ( 1 , # def.textures ) ]
2015-03-19 00:10:30 +01:00
self.base_mesh = def.mesh
end
-- set texture, model and size
local textures = self.base_texture
local mesh = self.base_mesh
2015-03-18 21:28:40 +01:00
local vis_size = self.visual_size
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
local colbox = self.collisionbox
2015-03-19 00:10:30 +01:00
-- specific texture if gotten
if self.gotten == true and def.gotten_texture then
textures = def.gotten_texture
end
-- specific mesh if gotten
if self.gotten == true and def.gotten_mesh then
mesh = def.gotten_mesh
2015-03-18 21:28:40 +01:00
end
-- if object is child then set half size
if self.child == true then
vis_size = { x = self.visual_size . x / 2 , y = self.visual_size . y / 2 }
2015-03-19 00:10:30 +01:00
if def.child_texture then
textures = def.child_texture [ 1 ]
end
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
colbox = { self.collisionbox [ 1 ] / 2 , self.collisionbox [ 2 ] / 2 , self.collisionbox [ 3 ] / 2 ,
self.collisionbox [ 4 ] / 2 , self.collisionbox [ 5 ] / 2 , self.collisionbox [ 6 ] / 2 }
2015-03-18 21:28:40 +01:00
end
2015-03-19 00:10:30 +01:00
-- remember settings
2014-10-28 18:01:32 +01:00
local tmp = {
lifetimer = self.lifetimer ,
tamed = self.tamed ,
2015-02-25 01:57:21 +01:00
gotten = self.gotten ,
2015-03-18 21:28:40 +01:00
child = self.child ,
horny = self.horny ,
hornytimer = self.hornytimer ,
mesh = mesh ,
textures = textures ,
visual_size = vis_size ,
2015-03-19 00:10:30 +01:00
base_texture = self.base_texture ,
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
collisionbox = colbox ,
2015-05-22 10:37:17 +02:00
owner = self.owner ,
2015-05-27 18:25:55 +02:00
health = self.health ,
2014-10-28 18:01:32 +01:00
}
2014-12-09 13:56:43 +01:00
self.object : set_properties ( tmp )
2014-10-28 18:01:32 +01:00
return minetest.serialize ( tmp )
end ,
on_punch = function ( self , hitter , tflp , tool_capabilities , dir )
2015-05-27 18:25:55 +02:00
-- weapon wear
local weapon = hitter : get_wielded_item ( )
if weapon : get_definition ( ) . tool_capabilities ~= nil then
local wear = ( weapon : get_definition ( ) . tool_capabilities.full_punch_interval / 75 ) * 9000
weapon : add_wear ( wear )
hitter : set_wielded_item ( weapon )
end
-- weapon sounds
if weapon : get_definition ( ) . sounds ~= nil then
local s = math.random ( 0 , # weapon : get_definition ( ) . sounds )
minetest.sound_play ( weapon : get_definition ( ) . sounds [ s ] , {
object = hitter ,
} )
else
minetest.sound_play ( " default_punch " , {
object = hitter ,
} )
end
2014-10-28 18:01:32 +01:00
2015-03-02 22:29:17 +01:00
check_for_death ( self )
2014-10-28 18:01:32 +01:00
2015-05-27 18:25:55 +02:00
-- blood_particles
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
local pos = self.object : getpos ( )
2015-04-11 21:45:03 +02:00
pos.y = pos.y + ( - self.collisionbox [ 2 ] + self.collisionbox [ 5 ] ) / 2
if self.blood_amount > 0 and pos and enable_blood == true then
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
effect ( pos , self.blood_amount , self.blood_texture )
2014-10-28 18:01:32 +01:00
end
2015-03-02 22:29:17 +01:00
2014-10-28 18:01:32 +01:00
-- knock back effect, adapted from blockmen's pyramids mod
local kb = self.knock_back
local r = self.recovery_time
2015-04-11 21:45:03 +02:00
local v = self.object : getvelocity ( )
2014-10-28 18:01:32 +01:00
if tflp < tool_capabilities.full_punch_interval then
kb = kb * ( tflp / tool_capabilities.full_punch_interval )
r = r * ( tflp / tool_capabilities.full_punch_interval )
end
2015-05-27 18:25:55 +02:00
self.object : setvelocity ( { x = dir.x * kb , y = 0 , z = dir.z * kb } )
2014-10-28 18:01:32 +01:00
self.pause_timer = r
2015-03-18 21:28:40 +01:00
2014-10-28 18:01:32 +01:00
-- attack puncher and call other mobs for help
2015-03-18 21:28:40 +01:00
if self.passive == false and not self.tamed then
2014-10-28 18:01:32 +01:00
if self.state ~= " attack " then
self.do_attack ( self , hitter , 1 )
end
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
-- alert others to the attack
local obj = nil
for _ , oir in pairs ( minetest.get_objects_inside_radius ( hitter : getpos ( ) , 5 ) ) do
obj = oir : get_luaentity ( )
2014-10-28 18:01:32 +01:00
if obj then
if obj.group_attack == true and obj.state ~= " attack " then
obj.do_attack ( obj , hitter , 1 )
end
end
end
end
end ,
} )
end
mobs.spawning_mobs = { }
2015-04-11 21:45:03 +02:00
function mobs : spawn_specific ( name , nodes , neighbors , min_light , max_light , interval , chance , active_object_count , min_height , max_height )
2015-04-12 22:45:04 +02:00
mobs.spawning_mobs [ name ] = true
2014-10-28 18:01:32 +01:00
minetest.register_abm ( {
nodenames = nodes ,
2015-04-11 21:45:03 +02:00
neighbors = neighbors ,
interval = interval ,
2014-10-28 18:01:32 +01:00
chance = chance ,
action = function ( pos , node , _ , active_object_count_wider )
2015-03-18 21:28:40 +01:00
-- do not spawn if too many active in area
2015-02-25 01:57:21 +01:00
if active_object_count_wider > active_object_count
2015-05-22 19:28:57 +02:00
or not mobs.spawning_mobs [ name ]
2015-03-02 22:29:17 +01:00
or not pos then
2014-12-15 00:17:29 +01:00
return
end
2015-02-25 01:57:21 +01:00
-- spawn above node
pos.y = pos.y + 1
2015-03-18 21:28:40 +01:00
-- mobs cannot spawn inside protected areas if enabled
2015-02-25 01:57:21 +01:00
if mobs.protected == 1 and minetest.is_protected ( pos , " " ) then
2014-10-28 18:01:32 +01:00
return
end
2015-02-25 01:57:21 +01:00
-- check if light and height levels are ok to spawn
2015-03-18 21:28:40 +01:00
local light = minetest.get_node_light ( pos )
if not light or light > max_light or light < min_light
2015-04-11 21:45:03 +02:00
or pos.y > max_height or pos.y < min_height then
2014-10-28 18:01:32 +01:00
return
end
2015-03-18 21:28:40 +01:00
-- are we spawning inside a solid node?
2015-03-02 22:29:17 +01:00
local nod = minetest.get_node_or_nil ( pos )
2015-04-20 23:12:05 +02:00
if not nod or not nod.name or not minetest.registered_nodes [ nod.name ]
2015-04-02 19:16:47 +02:00
or minetest.registered_nodes [ nod.name ] . walkable == true then return end
2015-02-25 01:57:21 +01:00
pos.y = pos.y + 1
2015-03-02 22:29:17 +01:00
nod = minetest.get_node_or_nil ( pos )
2015-04-20 23:12:05 +02:00
if not nod or not nod.name or not minetest.registered_nodes [ nod.name ]
2015-04-02 19:16:47 +02:00
or minetest.registered_nodes [ nod.name ] . walkable == true then return end
2014-10-28 18:01:32 +01:00
if minetest.setting_getbool ( " display_mob_spawn " ) then
minetest.chat_send_all ( " [mobs] Add " .. name .. " at " .. minetest.pos_to_string ( pos ) )
end
2015-02-25 01:57:21 +01:00
2015-03-02 22:29:17 +01:00
-- spawn mob half block higher
pos.y = pos.y - 0.5
2015-03-18 21:28:40 +01:00
minetest.add_entity ( pos , name )
2015-04-27 22:38:49 +02:00
--print ("Spawned "..name.." at "..minetest.pos_to_string(pos).." on "..node.name.." near "..neighbors[1])
2015-03-19 19:55:51 +01:00
2014-10-28 18:01:32 +01:00
end
} )
end
2015-04-11 21:45:03 +02:00
-- compatibility with older mob registration
function mobs : register_spawn ( name , nodes , max_light , min_light , chance , active_object_count , max_height )
2015-04-21 12:32:35 +02:00
mobs : spawn_specific ( name , nodes , { " air " } , min_light , max_light , 30 , chance , active_object_count , - 31000 , max_height )
2015-04-11 21:45:03 +02:00
end
2015-03-18 21:28:40 +01:00
-- particle effects
2015-04-27 22:38:49 +02:00
function effect ( pos , amount , texture , max_size )
2015-03-18 21:28:40 +01:00
minetest.add_particlespawner ( {
amount = amount ,
time = 0.25 ,
2015-04-02 19:16:47 +02:00
minpos = pos ,
maxpos = pos ,
2015-03-18 21:28:40 +01:00
minvel = { x =- 0 , y =- 2 , z =- 0 } ,
maxvel = { x = 2 , y = 2 , z = 2 } ,
minacc = { x =- 4 , y =- 4 , z =- 4 } ,
maxacc = { x = 4 , y = 4 , z = 4 } ,
minexptime = 0.1 ,
maxexptime = 1 ,
minsize = 0.5 ,
2015-04-27 22:38:49 +02:00
maxsize = ( max_size or 1 ) ,
2015-03-18 21:28:40 +01:00
texture = texture ,
} )
end
2015-04-21 11:54:43 +02:00
-- explosion
function mobs : explosion ( pos , radius , fire , smoke , sound )
-- node hit, bursts into flame (cannot blast through obsidian or protection redo mod items)
if not fire then fire = 0 end
if not smoke then smoke = 0 end
local pos = vector.round ( pos )
local radius = 1
local vm = VoxelManip ( )
local minp , maxp = vm : read_from_map ( vector.subtract ( pos , radius ) , vector.add ( pos , radius ) )
local a = VoxelArea : new ( { MinEdge = minp , MaxEdge = maxp } )
local data = vm : get_data ( )
local p = { }
2015-04-27 22:38:49 +02:00
local c_air = minetest.get_content_id ( " air " )
local c_ignore = minetest.get_content_id ( " ignore " )
local c_obsidian = minetest.get_content_id ( " default:obsidian " )
local c_brick = minetest.get_content_id ( " default:obsidianbrick " )
local c_chest = minetest.get_content_id ( " default:chest_locked " )
if sound and sound ~= " " then
minetest.sound_play ( sound , { pos = pos , gain = 1.0 , max_hear_distance = 16 } )
end
2015-04-21 11:54:43 +02:00
for z = - radius , radius do
for y = - radius , radius do
local vi = a : index ( pos.x + ( - radius ) , pos.y + y , pos.z + z )
for x = - radius , radius do
p.x = pos.x + x
p.y = pos.y + y
p.z = pos.z + z
2015-04-27 22:38:49 +02:00
if data [ vi ] ~= c_air and data [ vi ] ~= c_ignore and data [ vi ] ~= c_obsidian and data [ vi ] ~= c_brick and data [ vi ] ~= c_chest then
2015-04-21 11:54:43 +02:00
local n = minetest.get_node ( p ) . name
-- do NOT destroy protection nodes but DO destroy nodes in protected area
if not n : find ( " protector: " )
2015-06-24 15:20:27 +02:00
and not minetest.is_protected ( p , " " ) --/MFF (Crabman|06/23/2015) re-added node protected in areas
2015-06-23 22:29:54 +02:00
and minetest.get_item_group ( n , " unbreakable " ) ~= 1 then
2015-04-27 22:38:49 +02:00
-- if chest then drop items inside
if n == " default:chest " then
local meta = minetest.get_meta ( p )
local inv = meta : get_inventory ( )
for i = 1 , 32 do
local m_stack = inv : get_stack ( " main " , i )
local obj = minetest.add_item ( pos , m_stack )
if obj then
obj : setvelocity ( { x = math.random ( - 2 , 2 ) , y = 7 , z = math.random ( - 2 , 2 ) } )
end
2015-04-21 11:54:43 +02:00
end
end
2015-05-27 18:25:55 +02:00
if fire > 0 and ( minetest.registered_nodes [ n ] . groups.flammable or math.random ( 1 , 100 ) <= 30 ) then
minetest.set_node ( p , { name = " fire:basic_flame " } )
else
minetest.remove_node ( p )
end
if smoke > 0 then
effect ( p , 2 , " tnt_smoke.png " , 5 )
end
2015-04-21 11:54:43 +02:00
end
end
vi = vi + 1
end
end
2015-05-22 10:37:17 +02:00
end
2015-04-21 11:54:43 +02:00
end
2015-03-02 22:29:17 +01:00
-- on mob death drop items
function check_for_death ( self )
2015-04-11 21:45:03 +02:00
local hp = self.object : get_hp ( )
if hp > 0 then
2015-05-27 18:25:55 +02:00
if self.sounds . damage ~= nil then
2015-04-11 21:45:03 +02:00
minetest.sound_play ( self.sounds . damage , { object = self.object } )
2015-05-27 18:25:55 +02:00
self.health = hp
2015-04-11 21:45:03 +02:00
end
return
end
2015-03-18 21:28:40 +01:00
local pos = self.object : getpos ( )
pos.y = pos.y + 0.5 -- drop items half a block higher
self.object : remove ( )
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
local obj = nil
2015-03-18 21:28:40 +01:00
for _ , drop in ipairs ( self.drops ) do
if math.random ( 1 , drop.chance ) == 1 then
Update mobs mod
- api.lua (many improves, chicken egg more frequent, NPC attack nearly
mobs, textures code, etc…)
- Bee (spawn on group:flower now, textures code updated)
- Bunny (textures code updated)
- Chicken (two times more eggs, textures code updated)
- Cow (textures code updated)
- Creeper (finish reorganize the code, textures code updated, new eggs
inventory texture)
- Dirt Monster (textures code updated)
- Dungeon Master (textures code updated)
- init.lua (small credits tweaks)
- Kitten (textures code updated, now drop sometimes farming:string)
- Lava Flan (textures code updated, now 3 can spawn per chunck)
- Mese Monster (textures code updated)
- NPC (textures code updated, revert give raw meat versus health code
for tests)
- Oerkki (textures code updated, now 1 light damage)
- Rat (textures code updated)
- Sand Monster (textures code updated)
- Sheep (textures code updated, now give 2 to 3 wool when sheared)
- Spider (textures code updated, change credits, comments our
modifications)
- Stone Monster (textures code updated)
- Tree Monster (textures code updated)
- Warthog (textures code updated)
- Wolf (finish reorganize the code, textures code updated, add spawner
egg and an inventory texture)
- Tweaks some sounds
2015-03-31 19:32:46 +02:00
obj = minetest.add_item ( pos , ItemStack ( drop.name .. " " .. math.random ( drop.min , drop.max ) ) )
2015-03-18 21:28:40 +01:00
if obj then
obj : setvelocity ( { x = math.random ( - 1 , 1 ) , y = 5 , z = math.random ( - 1 , 1 ) } )
2015-03-02 22:29:17 +01:00
end
end
2015-03-18 21:28:40 +01:00
end
if self.sounds . death ~= nil then
2015-04-11 21:45:03 +02:00
minetest.sound_play ( self.sounds . death , { object = self.object } )
end
if self.on_die then
pos.y = pos.y - 0.5
self.on_die ( self , pos )
2015-03-02 22:29:17 +01:00
end
end
2015-04-20 23:12:05 +02:00
2015-04-27 22:38:49 +02:00
-- from TNT mod
function calc_velocity ( pos1 , pos2 , old_vel , power )
local vel = vector.direction ( pos1 , pos2 )
vel = vector.normalize ( vel )
vel = vector.multiply ( vel , power )
local dist = vector.distance ( pos1 , pos2 )
dist = math.max ( dist , 1 )
vel = vector.divide ( vel , dist )
vel = vector.add ( vel , old_vel )
return vel
end
-- modified from TNT mod
2015-06-24 15:20:27 +02:00
function entity_physics ( pos , radius , self ) --/MFF (Crabman|06/23/2015)add self to use punch function
2015-04-27 22:38:49 +02:00
radius = radius * 2
local objs = minetest.get_objects_inside_radius ( pos , radius )
local obj_pos , obj_vel , dist
for _ , obj in pairs ( objs ) do
obj_pos = obj : getpos ( )
obj_vel = obj : getvelocity ( )
2015-06-23 22:29:54 +02:00
--dist = math.max(1, vector.distance(pos, obj_pos))
2015-04-27 22:38:49 +02:00
if obj_vel ~= nil then
2015-05-22 10:37:17 +02:00
obj : setvelocity ( calc_velocity ( pos , obj_pos , obj_vel , radius * 10 ) )
2015-04-27 22:38:49 +02:00
end
2015-06-23 22:29:54 +02:00
--local damage = (4 / dist) * radius
2015-06-24 15:20:27 +02:00
obj : punch ( self.object , 1.0 , { full_punch_interval = 1.0 , damage_groups = { fleshy = self.damage } } ) --/MFF (Crabman|06/23/2015) use punch
2015-06-23 22:29:54 +02:00
--obj:set_hp(obj:get_hp() - damage)
2015-04-27 22:38:49 +02:00
end
2015-03-13 00:48:47 +01:00
end
2015-04-27 22:38:49 +02:00
-- register arrow for shoot attack
2014-10-28 18:01:32 +01:00
function mobs : register_arrow ( name , def )
2015-04-11 21:45:03 +02:00
if not name or not def then return end -- errorcheck
2014-10-28 18:01:32 +01:00
minetest.register_entity ( name , {
physical = false ,
visual = def.visual ,
visual_size = def.visual_size ,
textures = def.textures ,
velocity = def.velocity ,
hit_player = def.hit_player ,
hit_node = def.hit_node ,
2015-04-11 21:45:03 +02:00
hit_mob = def.hit_mob ,
drop = def.drop or false ,
2014-10-28 18:01:32 +01:00
collisionbox = { 0 , 0 , 0 , 0 , 0 , 0 } , -- remove box around arrows
on_step = function ( self , dtime )
2015-04-11 21:45:03 +02:00
self.timer = ( self.timer or 0 ) + 1
if self.timer > 150 then self.object : remove ( ) return end
local engage = 10 - ( self.velocity / 2 ) -- clear entity before arrow becomes active
2014-10-28 18:01:32 +01:00
local pos = self.object : getpos ( )
2014-12-25 18:34:34 +01:00
local node = minetest.get_node ( self.object : getpos ( ) ) . name
2015-04-11 21:45:03 +02:00
-- hit node you can walk on
if self.hit_node and node and minetest.registered_nodes [ node ] and minetest.registered_nodes [ node ] . walkable then
2014-10-28 18:01:32 +01:00
self.hit_node ( self , pos , node )
2015-04-11 21:45:03 +02:00
if self.drop == true then
pos.y = pos.y + 1 ; self.lastpos = ( self.lastpos or pos )
minetest.add_item ( self.lastpos , self.object : get_luaentity ( ) . name )
end
2014-10-28 18:01:32 +01:00
self.object : remove ( )
return
end
2015-02-25 01:57:21 +01:00
2015-04-11 21:45:03 +02:00
if self.hit_player or self.hit_mob then
for _ , player in pairs ( minetest.get_objects_inside_radius ( pos , 1 ) ) do
-- hit player
if self.hit_player and self.timer > engage and player : is_player ( ) then
self.hit_player ( self , player )
self.object : remove ( )
return
end
-- hit mob
if self.hit_mob and self.timer > engage and player : get_luaentity ( ) . name ~= self.object : get_luaentity ( ) . name
and player : get_luaentity ( ) . name ~= " __builtin:item " then
self.hit_mob ( self , player )
self.object : remove ( )
return
end
2014-10-28 18:01:32 +01:00
end
2015-04-11 21:45:03 +02:00
self.lastpos = pos
2014-10-28 18:01:32 +01:00
end
end
} )
end
2015-02-25 01:57:21 +01:00
-- Spawn Egg
function mobs : register_egg ( mob , desc , background , addegg )
2015-05-22 10:37:17 +02:00
local invimg = background
if addegg == 1 then
invimg = invimg .. " ^mobs_chicken_egg.png "
end
minetest.register_craftitem ( mob , {
description = desc ,
inventory_image = invimg ,
on_place = function ( itemstack , placer , pointed_thing )
local pos = pointed_thing.above
if pointed_thing.above and not minetest.is_protected ( pos , placer : get_player_name ( ) ) then
pos.y = pos.y + 0.5
local mob = minetest.add_entity ( pos , mob )
local ent = mob : get_luaentity ( )
2015-05-22 22:21:57 +02:00
if ent.type ~= " monster " then
2015-05-27 18:25:55 +02:00
-- set owner
2015-05-22 22:33:20 +02:00
ent.owner = placer : get_player_name ( )
2015-05-22 22:21:57 +02:00
ent.tamed = true
end
2015-05-22 10:37:17 +02:00
itemstack : take_item ( )
end
return itemstack
end ,
} )
2015-02-25 01:57:21 +01:00
end