mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-12-23 16:39:33 +01:00
Check if spawndef exists when spawning
This commit is contained in:
parent
7bd0b5a9b1
commit
ebf214c043
2 changed files with 89 additions and 86 deletions
|
@ -281,73 +281,74 @@ end
|
||||||
|
|
||||||
function mob_class:check_head_swivel(dtime)
|
function mob_class:check_head_swivel(dtime)
|
||||||
if not self.head_swivel or type(self.head_swivel) ~= "string" then return end
|
if not self.head_swivel or type(self.head_swivel) ~= "string" then return end
|
||||||
local final_rotation = vector.new(0,0,0)
|
local final_rotation = vector.new(0,0,0)
|
||||||
local pos = self.object:get_pos()
|
local oldp,oldr = self.object:get_bone_position(self.head_swivel)
|
||||||
|
|
||||||
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 10)) do
|
local pos = self.object:get_pos()
|
||||||
if obj:is_player() and not self.attack or obj:get_luaentity() and obj:get_luaentity().name == self.name and self ~= obj:get_luaentity() then
|
|
||||||
if not self._locked_object then
|
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 10)) do
|
||||||
if math.random(5000/self.curiosity) == 1 or vector.distance(pos,obj:get_pos())<4 and obj:is_player() then
|
if obj:is_player() and not self.attack or obj:get_luaentity() and obj:get_luaentity().name == self.name and self ~= obj:get_luaentity() then
|
||||||
self._locked_object = obj
|
if not self._locked_object then
|
||||||
end
|
if math.random(5000/self.curiosity) == 1 or vector.distance(pos,obj:get_pos())<4 and obj:is_player() then
|
||||||
else
|
self._locked_object = obj
|
||||||
if math.random(10000/self.curiosity) == 1 then
|
end
|
||||||
self._locked_object = nil
|
else
|
||||||
end
|
if math.random(10000/self.curiosity) == 1 then
|
||||||
|
self._locked_object = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.attack or self.following then
|
|
||||||
self._locked_object = self.attack or self.following
|
|
||||||
end
|
|
||||||
|
|
||||||
if self._locked_object and (self._locked_object:is_player() or self._locked_object:get_luaentity()) and self._locked_object:get_hp() > 0 then
|
|
||||||
local _locked_object_eye_height = 1.5
|
|
||||||
if self._locked_object:get_luaentity() then
|
|
||||||
_locked_object_eye_height = self._locked_object:get_luaentity().head_eye_height
|
|
||||||
end
|
|
||||||
if self._locked_object:is_player() then
|
|
||||||
_locked_object_eye_height = self._locked_object:get_properties().eye_height
|
|
||||||
end
|
|
||||||
if _locked_object_eye_height then
|
|
||||||
local self_rot = self.object:get_rotation()
|
|
||||||
if self.object:get_attach() then
|
|
||||||
self_rot = self.object:get_attach():get_rotation()
|
|
||||||
end
|
|
||||||
if self.rot then
|
|
||||||
local player_pos = self._locked_object:get_pos()
|
|
||||||
local direction_player = vector.direction(vector.add(self.object:get_pos(), vector.new(0, self.head_eye_height*.7, 0)), vector.add(player_pos, vector.new(0, _locked_object_eye_height, 0)))
|
|
||||||
local mob_yaw = math.deg(-(-(self_rot.y)-(-minetest.dir_to_yaw(direction_player))))+self.head_yaw_offset
|
|
||||||
local mob_pitch = math.deg(-dir_to_pitch(direction_player))*self.head_pitch_multiplier
|
|
||||||
|
|
||||||
if (mob_yaw < -60 or mob_yaw > 60) and not (self.attack and self.state == "attack" and not self.runaway) then
|
|
||||||
final_rotation = vector.multiply(oldr, 0.9)
|
|
||||||
elseif self.attack and self.state == "attack" and not self.runaway then
|
|
||||||
if self.head_yaw == "y" then
|
|
||||||
final_rotation = vector.new(mob_pitch, mob_yaw, 0)
|
|
||||||
elseif self.head_yaw == "z" then
|
|
||||||
final_rotation = vector.new(mob_pitch, 0, -mob_yaw)
|
|
||||||
end
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
if self.head_yaw == "y" then
|
|
||||||
final_rotation = vector.new(((mob_pitch-oldr.x)*.3)+oldr.x, ((mob_yaw-oldr.y)*.3)+oldr.y, 0)
|
|
||||||
elseif self.head_yaw == "z" then
|
|
||||||
final_rotation = vector.new(((mob_pitch-oldr.x)*.3)+oldr.x, 0, -(((mob_yaw-oldr.y)*.3)+oldr.y)*3)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
elseif not self._locked_object and math.abs(oldr.y) > 3 and math.abs(oldr.x) < 3 then
|
|
||||||
final_rotation = vector.multiply(oldr, 0.9)
|
|
||||||
else
|
|
||||||
final_rotation = vector.new(0,0,0)
|
|
||||||
end
|
|
||||||
|
|
||||||
mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horrizonatal_head_height), final_rotation)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if self.attack or self.following then
|
||||||
|
self._locked_object = self.attack or self.following
|
||||||
|
end
|
||||||
|
|
||||||
|
if self._locked_object and (self._locked_object:is_player() or self._locked_object:get_luaentity()) and self._locked_object:get_hp() > 0 then
|
||||||
|
local _locked_object_eye_height = 1.5
|
||||||
|
if self._locked_object:get_luaentity() then
|
||||||
|
_locked_object_eye_height = self._locked_object:get_luaentity().head_eye_height
|
||||||
|
end
|
||||||
|
if self._locked_object:is_player() then
|
||||||
|
_locked_object_eye_height = self._locked_object:get_properties().eye_height
|
||||||
|
end
|
||||||
|
if _locked_object_eye_height then
|
||||||
|
local self_rot = self.object:get_rotation()
|
||||||
|
if self.object:get_attach() then
|
||||||
|
self_rot = self.object:get_attach():get_rotation()
|
||||||
|
end
|
||||||
|
if self.rot then
|
||||||
|
local player_pos = self._locked_object:get_pos()
|
||||||
|
local direction_player = vector.direction(vector.add(self.object:get_pos(), vector.new(0, self.head_eye_height*.7, 0)), vector.add(player_pos, vector.new(0, _locked_object_eye_height, 0)))
|
||||||
|
local mob_yaw = math.deg(-(-(self_rot.y)-(-minetest.dir_to_yaw(direction_player))))+self.head_yaw_offset
|
||||||
|
local mob_pitch = math.deg(-dir_to_pitch(direction_player))*self.head_pitch_multiplier
|
||||||
|
|
||||||
|
if (mob_yaw < -60 or mob_yaw > 60) and not (self.attack and self.state == "attack" and not self.runaway) then
|
||||||
|
final_rotation = vector.multiply(oldr, 0.9)
|
||||||
|
elseif self.attack and self.state == "attack" and not self.runaway then
|
||||||
|
if self.head_yaw == "y" then
|
||||||
|
final_rotation = vector.new(mob_pitch, mob_yaw, 0)
|
||||||
|
elseif self.head_yaw == "z" then
|
||||||
|
final_rotation = vector.new(mob_pitch, 0, -mob_yaw)
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
if self.head_yaw == "y" then
|
||||||
|
final_rotation = vector.new(((mob_pitch-oldr.x)*.3)+oldr.x, ((mob_yaw-oldr.y)*.3)+oldr.y, 0)
|
||||||
|
elseif self.head_yaw == "z" then
|
||||||
|
final_rotation = vector.new(((mob_pitch-oldr.x)*.3)+oldr.x, 0, -(((mob_yaw-oldr.y)*.3)+oldr.y)*3)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif not self._locked_object and math.abs(oldr.y) > 3 and math.abs(oldr.x) < 3 then
|
||||||
|
final_rotation = vector.multiply(oldr, 0.9)
|
||||||
|
else
|
||||||
|
final_rotation = vector.new(0,0,0)
|
||||||
|
end
|
||||||
|
|
||||||
|
mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horrizonatal_head_height), final_rotation)
|
||||||
end
|
end
|
||||||
|
|
||||||
function mob_class:set_animation_speed()
|
function mob_class:set_animation_speed()
|
||||||
|
|
|
@ -664,34 +664,36 @@ if mobs_spawn then
|
||||||
end
|
end
|
||||||
local mob_def = mob_library_worker_table[mob_index]
|
local mob_def = mob_library_worker_table[mob_index]
|
||||||
--minetest.log(mob_def.name.." "..step_chance.. " "..mob_chance)
|
--minetest.log(mob_def.name.." "..step_chance.. " "..mob_chance)
|
||||||
local spawn_in_group = minetest.registered_entities[mob_def.name].spawn_in_group or 4
|
if mob_def and mob_def.name and minetest.registered_entities[mob_def.name] then
|
||||||
local spawn_in_group_min = minetest.registered_entities[mob_def.name].spawn_in_group_min or 1
|
local spawn_in_group = minetest.registered_entities[mob_def.name].spawn_in_group or 4
|
||||||
local mob_type = minetest.registered_entities[mob_def.name].type
|
local spawn_in_group_min = minetest.registered_entities[mob_def.name].spawn_in_group_min or 1
|
||||||
if spawn_check(spawning_position,mob_def) then
|
local mob_type = minetest.registered_entities[mob_def.name].type
|
||||||
if mob_def.type_of_spawning == "water" then
|
if spawn_check(spawning_position,mob_def) then
|
||||||
spawning_position = get_water_spawn(spawning_position)
|
if mob_def.type_of_spawning == "water" then
|
||||||
if not spawning_position then
|
spawning_position = get_water_spawn(spawning_position)
|
||||||
minetest.log("warning","[mcl_mobs] no water spawn for mob "..mob_def.name.." found at "..minetest.pos_to_string(vector.round(pos)))
|
if not spawning_position then
|
||||||
|
minetest.log("warning","[mcl_mobs] no water spawn for mob "..mob_def.name.." found at "..minetest.pos_to_string(vector.round(pos)))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if minetest.registered_entities[mob_def.name].can_spawn and not minetest.registered_entities[mob_def.name].can_spawn(spawning_position) then
|
||||||
|
minetest.log("warning","[mcl_mobs] mob "..mob_def.name.." refused to spawn at "..minetest.pos_to_string(vector.round(spawning_position)))
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
--everything is correct, spawn mob
|
||||||
if minetest.registered_entities[mob_def.name].can_spawn and not minetest.registered_entities[mob_def.name].can_spawn(spawning_position) then
|
local object
|
||||||
minetest.log("warning","[mcl_mobs] mob "..mob_def.name.." refused to spawn at "..minetest.pos_to_string(vector.round(spawning_position)))
|
if spawn_in_group and ( mob_type ~= "monster" or math.random(5) == 1 ) then
|
||||||
return
|
if logging then
|
||||||
end
|
minetest.log("action", "[mcl_mobs] A group of mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at " .. minetest.pos_to_string(spawning_position, 1))
|
||||||
--everything is correct, spawn mob
|
end
|
||||||
local object
|
object = spawn_group(spawning_position,mob_def,{minetest.get_node(vector.offset(spawning_position,0,-1,0)).name},spawn_in_group,spawn_in_group_min)
|
||||||
if spawn_in_group and ( mob_type ~= "monster" or math.random(5) == 1 ) then
|
|
||||||
if logging then
|
|
||||||
minetest.log("action", "[mcl_mobs] A group of mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at " .. minetest.pos_to_string(spawning_position, 1))
|
|
||||||
end
|
|
||||||
object = spawn_group(spawning_position,mob_def,{minetest.get_node(vector.offset(spawning_position,0,-1,0)).name},spawn_in_group,spawn_in_group_min)
|
|
||||||
|
|
||||||
else
|
else
|
||||||
if logging then
|
if logging then
|
||||||
minetest.log("action", "[mcl_mobs] Mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at ".. minetest.pos_to_string(spawning_position, 1))
|
minetest.log("action", "[mcl_mobs] Mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at ".. minetest.pos_to_string(spawning_position, 1))
|
||||||
|
end
|
||||||
|
object = mcl_mobs.spawn(spawning_position, mob_def.name)
|
||||||
end
|
end
|
||||||
object = mcl_mobs.spawn(spawning_position, mob_def.name)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
current_summary_chance = current_summary_chance - mob_chance
|
current_summary_chance = current_summary_chance - mob_chance
|
||||||
|
|
Loading…
Reference in a new issue