mirror of
https://github.com/ElCeejo/animalia.git
synced 2025-08-07 23:18:09 -04:00
Libri improvements
This commit is contained in:
parent
712d1c7daa
commit
2999966fc0
5 changed files with 181 additions and 271 deletions
235
api/api.lua
235
api/api.lua
|
@ -195,7 +195,9 @@ function animalia.head_tracking(self)
|
|||
end
|
||||
animalia.move_head(self, tyaw, dir.y)
|
||||
return
|
||||
elseif self:timer(random(6, 12)) then
|
||||
elseif self:timer(6)
|
||||
and random(4) < 2 then
|
||||
|
||||
local players = creatura.get_nearby_players(self, 6)
|
||||
self.head_tracking = #players > 0 and players[random(#players)]
|
||||
end
|
||||
|
@ -220,69 +222,16 @@ end
|
|||
------------------------
|
||||
-- Environment Access --
|
||||
------------------------
|
||||
|
||||
function animalia.set_nametag(self, clicker)
|
||||
local plyr_name = clicker and clicker:get_player_name()
|
||||
if not plyr_name then return end
|
||||
local item = clicker:get_wielded_item()
|
||||
if item
|
||||
and item:get_name() ~= "animalia:nametag" then
|
||||
return
|
||||
end
|
||||
local name = item:get_meta():get_string("name")
|
||||
if not name
|
||||
or name == "" then
|
||||
return
|
||||
end
|
||||
self.nametag = self:memorize("nametag", name)
|
||||
self.despawn_after = self:memorize("despawn_after", nil)
|
||||
activate_nametag(self)
|
||||
if not minetest.is_creative_enabled(plyr_name) then
|
||||
item:take_item()
|
||||
clicker:set_wielded_item(item)
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function animalia.get_group_positions(name, pos, radius)
|
||||
local objects = minetest.get_objects_in_area(vec_sub(pos, radius), vec_add(pos, radius))
|
||||
local group = {}
|
||||
for i = 1, #objects do
|
||||
local object = objects[i]
|
||||
if object
|
||||
and object:get_luaentity()
|
||||
and object:get_luaentity().name == name then
|
||||
table.insert(group, object:get_pos())
|
||||
end
|
||||
end
|
||||
return group
|
||||
end
|
||||
|
||||
function animalia.get_group(self)
|
||||
function animalia.get_nearby_mate(self)
|
||||
local pos = self.object:get_pos()
|
||||
local radius = self.tracking_range
|
||||
local objects = minetest.get_objects_in_area(vec_sub(pos, radius), vec_add(pos, radius))
|
||||
local group = {}
|
||||
for i = 1, #objects do
|
||||
local object = objects[i]
|
||||
if object
|
||||
and object ~= self.object
|
||||
and object:get_luaentity()
|
||||
and object:get_luaentity().name == self.name then
|
||||
table.insert(group, object)
|
||||
end
|
||||
end
|
||||
return group
|
||||
end
|
||||
|
||||
function animalia.get_nearby_mate(self, name)
|
||||
local objects = minetest.get_objects_inside_radius(self:get_center_pos(), self.tracking_range)
|
||||
if not pos then return end
|
||||
local objects = creatura.get_nearby_objects(self, self.name)
|
||||
for _, object in ipairs(objects) do
|
||||
if creatura.is_alive(object)
|
||||
and not object:is_player()
|
||||
and object:get_luaentity().name == name
|
||||
and object:get_luaentity().gender ~= self.gender
|
||||
and object:get_luaentity().breeding then
|
||||
local obj_pos = object and object:get_pos()
|
||||
local ent = obj_pos and object:get_luaentity()
|
||||
if obj_pos
|
||||
and ent.gender ~= self.gender
|
||||
and ent.breeding then
|
||||
return object
|
||||
end
|
||||
end
|
||||
|
@ -313,11 +262,6 @@ function animalia.random_drop_item(self, item, chance)
|
|||
end
|
||||
end
|
||||
|
||||
function animalia.protect_from_despawn(self)
|
||||
self._despawn = self:memorize("_despawn", false)
|
||||
self.despawn_after = self:memorize("despawn_after", false)
|
||||
end
|
||||
|
||||
---------------
|
||||
-- Particles --
|
||||
---------------
|
||||
|
@ -367,9 +311,38 @@ function animalia.particle_spawner(pos, texture, type, min_pos, max_pos)
|
|||
end
|
||||
end
|
||||
|
||||
--------------
|
||||
-- Entities --
|
||||
--------------
|
||||
----------
|
||||
-- Mobs --
|
||||
----------
|
||||
|
||||
function animalia.protect_from_despawn(self)
|
||||
self._despawn = self:memorize("_despawn", false)
|
||||
self.despawn_after = self:memorize("despawn_after", false)
|
||||
end
|
||||
|
||||
function animalia.set_nametag(self, clicker)
|
||||
local plyr_name = clicker and clicker:get_player_name()
|
||||
if not plyr_name then return end
|
||||
local item = clicker:get_wielded_item()
|
||||
if item
|
||||
and item:get_name() ~= "animalia:nametag" then
|
||||
return
|
||||
end
|
||||
local name = item:get_meta():get_string("name")
|
||||
if not name
|
||||
or name == "" then
|
||||
return
|
||||
end
|
||||
self.nametag = self:memorize("nametag", name)
|
||||
self.despawn_after = self:memorize("despawn_after", nil)
|
||||
activate_nametag(self)
|
||||
if not minetest.is_creative_enabled(plyr_name) then
|
||||
item:take_item()
|
||||
clicker:set_wielded_item(item)
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
function animalia.initialize_api(self)
|
||||
self.gender = self:recall("gender") or nil
|
||||
|
@ -467,55 +440,73 @@ function animalia.add_trust(self, player, amount)
|
|||
self:memorize("trust", self.trust)
|
||||
end
|
||||
|
||||
function animalia.feed(self, player, tame, breed)
|
||||
local plyr_name = clicker and clicker:get_player_name()
|
||||
if not plyr_name then return end
|
||||
local item, item_name = self:follow_wielded_item(player)
|
||||
function animalia.feed(self, clicker, breed, tame)
|
||||
local yaw = self.object:get_yaw()
|
||||
local pos = self.object:get_pos()
|
||||
if not pos then return end
|
||||
local name = clicker:is_player() and clicker:get_player_name()
|
||||
local item, item_name = self:follow_wielded_item(clicker)
|
||||
if item_name then
|
||||
if not minetest.is_creative_enabled(plyr_name) then
|
||||
-- Eat Animation
|
||||
local offset_h = self.head_data.pivot_h
|
||||
local offset_v = self.head_data.pivot_v
|
||||
local head_pos = {
|
||||
x = pos.x + sin(yaw) * -offset_h,
|
||||
y = pos.y + offset_v,
|
||||
z = pos.z + cos(yaw) * offset_h
|
||||
}
|
||||
local def = minetest.registered_items[item_name]
|
||||
if def.inventory_image then
|
||||
minetest.add_particlespawner({
|
||||
pos = head_pos,
|
||||
time = 0.1,
|
||||
amount = 3,
|
||||
collisiondetection = true,
|
||||
collision_removal = true,
|
||||
vel = {min = {x = -1, y = 3, z = -1}, max = {x = 1, y = 4, z = 1}},
|
||||
acc = {x = 0, y = -9.8, z = 0},
|
||||
size = {min = 2, max = 4},
|
||||
texture = def.inventory_image
|
||||
})
|
||||
end
|
||||
-- Increase Health
|
||||
local feed_no = (self.feed_no or 0) + 1
|
||||
local max_hp = self.max_health
|
||||
local hp = self.hp
|
||||
hp = hp + (max_hp / 5)
|
||||
if hp > max_hp then hp = max_hp end
|
||||
self.hp = hp
|
||||
-- Tame/Breed
|
||||
if feed_no >= 5 then
|
||||
feed_no = 0
|
||||
if tame then
|
||||
self.owner = self:memorize("owner", name)
|
||||
minetest.add_particlespawner({
|
||||
pos = {min = vec_sub(pos, self.width), max = vec_add(pos, self.width)},
|
||||
time = 0.1,
|
||||
amount = 12,
|
||||
vel = {min = {x = 0, y = 3, z = 0}, max = {x = 0, y = 4, z = 0}},
|
||||
size = {min = 4, max = 6},
|
||||
glow = 16,
|
||||
texture = "creatura_particle_green.png"
|
||||
})
|
||||
end
|
||||
if breed
|
||||
and self.owner
|
||||
and self.owner == name then
|
||||
-- TODO: Breeding
|
||||
end
|
||||
self._despawn = self:memorize("_despawn", false)
|
||||
self.despawn_after = self:memorize("despawn_after", false)
|
||||
end
|
||||
self.feed_no = feed_no
|
||||
-- Take item
|
||||
if not minetest.is_creative_enabled(name) then
|
||||
item:take_item()
|
||||
player:set_wielded_item(item)
|
||||
clicker:set_wielded_item(item)
|
||||
end
|
||||
if self.hp < self.max_health then
|
||||
self:heal(self.max_health / 5)
|
||||
end
|
||||
self.food = self.food + 1
|
||||
if self.food >= 5 then
|
||||
local pos = self:get_center_pos()
|
||||
local minp = vec_sub(pos, 1)
|
||||
local maxp = vec_add(pos, 1)
|
||||
self.food = 0
|
||||
local follow = self.follow
|
||||
if type(follow) == "table" then
|
||||
follow = follow[1]
|
||||
end
|
||||
if tame
|
||||
and not self.owner
|
||||
and (follow == item_name) then
|
||||
self.owner = self:memorize("owner", player:get_player_name())
|
||||
local name = correct_name(self.name)
|
||||
minetest.chat_send_player(player:get_player_name(), name .. " has been tamed!")
|
||||
if self.logic then
|
||||
self:clear_task()
|
||||
end
|
||||
animalia.particle_spawner(pos, "creatura_particle_green.png", "float", minp, maxp)
|
||||
if not animalia.pets[self.owner][self.object] then
|
||||
table.insert(animalia.pets[self.owner], self.object)
|
||||
end
|
||||
end
|
||||
if breed then
|
||||
if self.breeding then return false end
|
||||
if self.breeding_cooldown <= 0 then
|
||||
self.breeding = true
|
||||
self.breeding_cooldown = 60
|
||||
animalia.particle_spawner(pos, "heart.png", "float", minp, maxp)
|
||||
end
|
||||
end
|
||||
end
|
||||
animalia.protect_from_despawn(self)
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function animalia.mount(self, player, params)
|
||||
|
@ -592,22 +583,6 @@ minetest.register_on_mods_loaded(function()
|
|||
end
|
||||
end)
|
||||
|
||||
local spawn_biomes = {
|
||||
["animalia:bat"] = "cave",
|
||||
["animalia:bird"] = "temperate",
|
||||
["animalia:cat"] = "urban",
|
||||
["animalia:chicken"] = "tropical",
|
||||
["animalia:cow"] = "grassland",
|
||||
["animalia:tropical_fish"] = "ocean",
|
||||
["animalia:frog"] = "swamp",
|
||||
["animalia:horse"] = "grassland",
|
||||
["animalia:pig"] = "temperate",
|
||||
["animalia:reindeer"] = "boreal",
|
||||
["animalia:sheep"] = "grassland",
|
||||
["animalia:turkey"] = "boreal",
|
||||
["animalia:wolf"] = "boreal",
|
||||
}
|
||||
|
||||
animalia.register_biome_group("temperate", {
|
||||
name_kw = "",
|
||||
turf_kw = "grass",
|
||||
|
|
|
@ -972,10 +972,17 @@ creatura.register_utility("animalia:attack_target", function(self, target)
|
|||
local tgt_alive, _, tgt_pos = _self:get_target(target)
|
||||
if not tgt_alive then return true end
|
||||
local dist = vec_dist(pos, tgt_pos)
|
||||
if dist < width + 1
|
||||
local punch_cooldown = self.punch_cooldown or 0
|
||||
if punch_cooldown > 0 then
|
||||
punch_cooldown = punch_cooldown - self.dtime
|
||||
end
|
||||
self.punch_cooldown = punch_cooldown
|
||||
if punch_cooldown <= 0
|
||||
and dist < width + 1
|
||||
and not punch_init then
|
||||
punch_init = true
|
||||
animalia.action_punch(_self, target)
|
||||
self.punch_cooldown = 3
|
||||
end
|
||||
if not _self:get_action() then
|
||||
if punch_init then return true end
|
||||
|
|
|
@ -101,7 +101,7 @@ local function generate_page(mob)
|
|||
element_type = "label",
|
||||
center_text = true,
|
||||
font_size = 20,
|
||||
offset = {x = 9, y = 1.5},
|
||||
offset = {x = 8, y = 1.5},
|
||||
file = "animalia_libri_" .. name .. ".txt"
|
||||
},
|
||||
{ -- Image
|
||||
|
@ -200,7 +200,7 @@ minetest.register_on_mods_loaded(function()
|
|||
element_type = "label",
|
||||
center_text = true,
|
||||
font_size = 24,
|
||||
offset = {x = 1, y = 1.5},
|
||||
offset = {x = 0, y = 1.5},
|
||||
file = "animalia_libri_home.txt"
|
||||
},
|
||||
{
|
||||
|
@ -228,7 +228,7 @@ minetest.register_on_mods_loaded(function()
|
|||
element_type = "label",
|
||||
center_text = true,
|
||||
font_size = 20,
|
||||
offset = {x = 9, y = 1.5},
|
||||
offset = {x = 8, y = 1.5},
|
||||
file = "animalia_libri_tropical_fish.txt"
|
||||
},
|
||||
{ -- Image
|
||||
|
@ -366,31 +366,21 @@ function libri.render_element(def, meta, playername)
|
|||
if def.element_type == "label" then
|
||||
local font_size_x = (animalia.libri_font_size[playername] or 1)
|
||||
local font_size = (def.font_size or 16) * font_size_x
|
||||
form = form .. "style_type[label;font_size=" .. font_size .. "]"
|
||||
if def.file then
|
||||
local filename = path .. "/libri/" .. def.file
|
||||
local file = io.open(filename)
|
||||
if file then
|
||||
local i = 0
|
||||
local full_text = ""
|
||||
for line in file:lines() do
|
||||
i = i + 1
|
||||
local center_offset = 0
|
||||
local max_length = 42
|
||||
local line_length = line:len()
|
||||
if line_length > max_length then line_length = max_length end
|
||||
local total_line_area = font_size * line_length
|
||||
local total_max_area = font_size * max_length
|
||||
if def.center_text then
|
||||
center_offset = ((total_max_area - total_line_area) / 100) * 0.3
|
||||
end
|
||||
local line_unit = (max_length * 0.075)
|
||||
local align_x = (offset_x + line_unit - (line_unit * font_size_x)) + center_offset
|
||||
local align_y = offset_y + (page_spacing * font_size_x) * i
|
||||
form = form .. "label[" .. align_x .. "," .. align_y .. ";" .. color("#000000", line .. "\n") .. "]"
|
||||
full_text = full_text .. line .. "\n"
|
||||
end
|
||||
local total_offset = (offset_x + (0.35 - 0.35 * font_size_x)) .. "," .. offset_y
|
||||
form = form .. "hypertext[" .. total_offset .. ";8,9;text;<global color=#000000 size=".. font_size .. " halign=center>" .. full_text .. "]"
|
||||
file:close()
|
||||
end
|
||||
else
|
||||
form = form .. "style_type[label;font_size=" .. font_size .. "]"
|
||||
local line = def.text
|
||||
form = form .. "label[" .. offset_x .. "," .. offset_y .. ";" .. color("#000000", line .. "\n") .. "]"
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue