Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
af3f4f7
Bunch of minor fixes
MoNTE48 Jun 17, 2023
6a291d9
Assign ice/fire damage to player
MoNTE48 Jun 17, 2023
2df1e02
Add more `minetest.is_protected` checks and disable `dragon_terrain_d…
MoNTE48 Jun 17, 2023
3257837
Hotfix: attempt to call method 'get_center_pos' (a nil value)
MoNTE48 Jun 18, 2023
acb1d25
Few other hotfix'es
MoNTE48 Jun 20, 2023
e6fd47d
Fix `get_pointed_mob` function
MoNTE48 Jun 20, 2023
069bc73
Fix few mount.lua crashes
MoNTE48 Jul 3, 2023
24c3a47
Add `nil` check to the `update_emission` function
MoNTE48 Jul 6, 2023
5870bf5
Fix `get_customize_formspec` crash
MoNTE48 Jul 15, 2023
8e5f048
Fix `player` is nil crash
MoNTE48 Aug 12, 2023
cae26fc
Merge remote-tracking branch 'upstream/main' into multicraft
MoNTE48 Aug 15, 2023
71df690
Fix 'turn_rate' is nil crash
MoNTE48 Aug 15, 2023
0f0ff34
Fix `get_wyvern_formspec` crash
MoNTE48 Sep 25, 2023
463a860
Fix `attach_player` and `attach_passenger` crashes
MoNTE48 Sep 25, 2023
f820222
Fix `get_pointed_mob` function
MoNTE48 Oct 18, 2023
c958379
Fix "stairs" mod crash
MoNTE48 May 21, 2024
239d0b6
Minor changes
MoNTE48 May 21, 2024
18c2bae
Handle `fake_player` is nil
MoNTE48 Sep 12, 2024
6e06477
Fix duplicate aliases and use `initial_properties`
MoNTE48 Jan 2, 2025
60f458b
Replace deprecated `get3dMap_flat` on `get_3d_map_flat`
MoNTE48 Jan 4, 2025
9538c87
Better fix for `hud_remove` crash
MoNTE48 Jan 15, 2025
b02b4b4
Merge remote-tracking branch 'upstream/main' into multicraft
MoNTE48 Jan 30, 2025
83cde32
Fix mod translation
MoNTE48 Feb 12, 2025
9453845
Add RU translation
MoNTE48 Feb 23, 2025
f02b746
Add screenshot.png
MoNTE48 Feb 23, 2025
c6e818a
Fix mod compatibility issues
MoNTE48 Feb 23, 2025
dd41009
Minor translation fixes
MoNTE48 Feb 23, 2025
1c6ae4f
Fix translations
MoNTE48 Feb 24, 2025
b23aaa1
Fix crash in `register_on_dieplayer`
MoNTE48 Mar 15, 2025
5a0cd23
Few `nil` checks
MoNTE48 Mar 23, 2025
4c42fbf
Add missing `use_texture_alpha`
MoNTE48 Mar 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 40 additions & 30 deletions api/api.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
-- API --
---------

local S = draconis.S

-- Math --

local pi = math.pi
Expand Down Expand Up @@ -53,7 +55,7 @@ local yaw2dir = minetest.yaw_to_dir
-- Settings --
--------------

local terrain_destruction = minetest.settings:get_bool("dragon_terrain_destruction", true)
local terrain_destruction = minetest.settings:get_bool("dragon_terrain_destruction", false)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please note the unwanted change!


---------------------
-- Local Utilities --
Expand Down Expand Up @@ -302,7 +304,8 @@ local function generate_texture(self, force)
self.wing_overlay = "(draconis_wing_fade.png^[multiply:" .. color .. ")"
self:memorize("wing_overlay", self.wing_overlay)
end
if self:get_props().textures[1]:find("wing_fade") and not force then return end
local props = self:get_props()
if props and props.textures and props.textures[1]:find("wing_fade") and not force then return end
textures[1] = textures[1] .. "^" .. self.wing_overlay
self:set_texture(1, textures)
end
Expand Down Expand Up @@ -690,7 +693,12 @@ local function damage_objects(self, pos, radius)
damage = is_mob and (ent.hp or ent.health or 0) > 0
end
if damage then
object:punch(self.object, 1.0, {damage_groups = {fleshy = math.ceil(self.damage * 0.33)}})
local puncher = self.object
if self.rider
and self.rider:get_look_horizontal() then
puncher = self.rider
end
object:punch(puncher, 1.0, {damage_groups = {fleshy = math.ceil(self.damage * 0.33)}})
--self:punch_target(object, math.ceil(self.damage * 0.2))
if self.name == "draconis:ice_dragon" then
freeze_object(object)
Expand Down Expand Up @@ -1161,13 +1169,15 @@ draconis.dragon_api = {
if collision.type == "node" then
local n_pos = collision.node_pos
if n_pos.y - pos.y >= 1 then
local node = minetest.get_node(n_pos)
if minetest.get_item_group(node.name, "cracky") ~= 1
and minetest.get_item_group(node.name, "unbreakable") < 1 then
if random(6) < 2 then
minetest.dig_node(n_pos)
else
minetest.remove_node(n_pos)
if not minetest.is_protected(n_pos, "") then
local node = minetest.get_node(n_pos)
if minetest.get_item_group(node.name, "cracky") ~= 1
and minetest.get_item_group(node.name, "unbreakable") < 1 then
if random(6) < 2 then
minetest.dig_node(n_pos)
else
minetest.remove_node(n_pos)
end
end
end
end
Expand All @@ -1177,6 +1187,7 @@ draconis.dragon_api = {
-- Textures
update_emission = function(self, force)
local pos = self.object:get_pos()
if not pos then return end
local level = minetest.get_node_light(pos, minetest.get_timeofday())
if not level then return end
local texture = self:get_props().textures[1]
Expand All @@ -1203,7 +1214,7 @@ draconis.dragon_api = {
if self.name == "draconis:fire_dragon" then
dragon_type = "fire"
end
local eyes = "draconis_" .. dragon_type .. "_eyes_".. self.eye_color .. ".png"
local eyes = "draconis_" .. dragon_type .. "_eyes_".. self.eye_color .. ".png"
if self.growth_scale < 0.25 then
eyes = "draconis_" .. dragon_type .. "_eyes_child_".. self.eye_color .. ".png"
end
Expand Down Expand Up @@ -1619,17 +1630,16 @@ minetest.register_chatcommand("tamedragon", {
pos.y = pos.y + player:get_properties().eye_height or 1.625
local dest = vec_add(pos, vec_multi(dir, 40))
local object, ent = get_pointed_mob(pos, dest)
if object
and ent.name:match("^draconis:")
if object and ent
and ent.memorize then
local ent_pos = object:get_pos()
local ent_pos = ent:get_center_pos()
local particle = "creatura_particle_green.png"
if not ent.owner then
ent.owner = name
ent:memorize("owner", ent.owner)
minetest.chat_send_player(name, correct_name(ent.name) .. " has been tamed!")
minetest.chat_send_player(name, S("@1 has been tamed!", correct_name(ent.name)))
else
minetest.chat_send_player(name, correct_name(ent.name) .. " is already tamed.")
minetest.chat_send_player(name, S("@1 is already tamed.", correct_name(ent.name)))
particle = "creatura_particle_red.png"
end
minetest.add_particlespawner({
Expand All @@ -1655,7 +1665,7 @@ minetest.register_chatcommand("tamedragon", {
glow = 16
})
else
minetest.chat_send_player(name, "You must be pointing at a mob.")
minetest.chat_send_player(name, S("You must be pointing at a mob."))
end
end
})
Expand All @@ -1673,12 +1683,12 @@ minetest.register_chatcommand("set_dragon_owner", {
pos.y = pos.y + player:get_properties().eye_height or 1.625
local dest = vec_add(pos, vec_multi(dir, 40))
local object, ent = get_pointed_mob(pos, dest)
if object then
if object and ent then
local ent_pos = ent:get_center_pos()
local particle = "creatura_particle_green.png"
ent.owner = param_name
ent:memorize("owner", ent.owner)
minetest.chat_send_player(name, correct_name(ent.name) .. " is now owned by " .. param_name)
minetest.chat_send_player(name, S("@1 is now owned by @2", correct_name(ent.name), param_name))
minetest.add_particlespawner({
amount = 16,
time = 0.25,
Expand All @@ -1702,13 +1712,13 @@ minetest.register_chatcommand("set_dragon_owner", {
glow = 16
})
else
minetest.chat_send_player(name, "You must be pointing at a mob.")
minetest.chat_send_player(name, S("You must be pointing at a mob."))
end
end
})

minetest.register_chatcommand("revive_dragon", {
description = "Revives pointed Dragon",
description = S("Revives pointed Dragon"),
privs = {draconis_admin = true},
func = function(name)
local player = minetest.get_player_by_name(name)
Expand All @@ -1718,13 +1728,13 @@ minetest.register_chatcommand("revive_dragon", {
pos.y = pos.y + player:get_properties().eye_height or 1.625
local dest = vec_add(pos, vec_multi(dir, 40))
local object, ent = get_pointed_mob(pos, dest)
if object
if object and ent
and ent.hp <= 0 then
local ent_pos = ent:get_center_pos()
local particle = "creatura_particle_green.png"
ent.hp = ent.max_health
ent:memorize("hp", ent.hp)
minetest.chat_send_player(name, correct_name(ent.name) .. " has been revived!")
minetest.chat_send_player(name, S("@1 has been revived!", correct_name(ent.name)))
minetest.add_particlespawner({
amount = 16,
time = 0.25,
Expand All @@ -1748,42 +1758,42 @@ minetest.register_chatcommand("revive_dragon", {
glow = 16
})
else
minetest.chat_send_player(name, "You must be pointing at a mob.")
minetest.chat_send_player(name, S("You must be pointing at a mob."))
end
end
})

minetest.register_chatcommand("dragon_attack_blacklist_add", {
description = "Adds player to attack blacklist",
description = S("Adds player to attack blacklist"),
params = "<name>",
privs = {draconis_admin = true},
func = function(name, params)
local player = minetest.get_player_by_name(name)
local param_name = params:match("%S+")
if not player or not param_name then return false end
if draconis.attack_blacklist[param_name] then
minetest.chat_send_player(name, param_name .. " is already on the Dragon attack blacklist.")
minetest.chat_send_player(name, S("@1 is already on the Dragon attack blacklist.", param_name))
return false
end
draconis.attack_blacklist[param_name] = true
minetest.chat_send_player(name, param_name .. " has been added to the Dragon attack blacklist.")
minetest.chat_send_player(name, S("@1 has been added to the Dragon attack blacklist.", param_name))
end
})

minetest.register_chatcommand("dragon_attack_blacklist_remove", {
description = "Removes player to attack blacklist",
description = S("Removes player to attack blacklist"),
params = "<name>",
privs = {draconis_admin = true},
func = function(name, params)
local player = minetest.get_player_by_name(name)
local param_name = params:match("%S+")
if not player or not param_name then return false end
if not draconis.attack_blacklist[param_name] then
minetest.chat_send_player(name, param_name .. " isn't on the Dragon attack blacklist.")
minetest.chat_send_player(name, S("@1 isn't on the Dragon attack blacklist.", param_name))
return false
end
draconis.attack_blacklist[param_name] = nil
minetest.chat_send_player(name, param_name .. " has been removed from the Dragon attack blacklist.")
minetest.chat_send_player(name, S("@1 has been removed from the Dragon attack blacklist.", param_name))
end
})

Expand Down
6 changes: 4 additions & 2 deletions api/behaviors.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
-- Behaviors --
---------------

local S = draconis.S

draconis.fire_dragon_targets = {}

draconis.ice_dragon_targets = {}
Expand Down Expand Up @@ -906,15 +908,15 @@ creatura.register_utility("draconis:wyvern_breaking", function(self, player)
texture = texture,
})
minetest.chat_send_player(player:get_player_name(),
"The Jungle Wyvern ate some " .. def.description .. "! Taming is at " .. taming .. "%")
S("The Jungle Wyvern ate some @1! Taming is at @2%", def.description, taming))
else
draconis.detach_player(_self, player)
return true
end
feed_timer = 10
end
if taming >= 100 then
minetest.chat_send_player(player:get_player_name(), "The Jungle Wyvern has been tamed!")
minetest.chat_send_player(player:get_player_name(), S("The Jungle Wyvern has been tamed!"))
_self.owner = _self:memorize("owner", player:get_player_name())
return true
end
Expand Down
14 changes: 8 additions & 6 deletions api/forms.lua
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,9 @@ local function get_dragon_formspec(self)
local breath = get_perc(self.attack_stamina, 100)
-- Visuals
local frame_range = self.animations["stand"].range
local frame_loop = frame_range.x .. "," .. frame_range.y
local texture = self:get_props().textures[1]
local frame_loop = frame_range.x .. "," .. frame_range.y
local props = self:get_props()
local texture = (props and props.textures and props.textures[1]) or "blank.png"
local health_ind = "draconis_forms_health_bg.png^[lowpart:" .. health .. ":draconis_forms_health_fg.png"
local hunger_ind = "draconis_forms_hunger_bg.png^[lowpart:" .. hunger .. ":draconis_forms_hunger_fg.png"
local stamina_ind = "draconis_forms_stamina_bg.png^[lowpart:" .. stamina .. ":draconis_forms_stamina_fg.png"
Expand Down Expand Up @@ -106,9 +107,10 @@ draconis.dragon_api.show_formspec = function(self, player)
end

local function get_customize_formspec(self)
local texture = self.object:get_properties().textures[1]
local props = self.object:get_properties()
local texture = (props and props.textures and props.textures[1]) or "blank.png"
local frame_range = self.animations["stand"].range
local frame_loop = frame_range.x .. "," .. frame_range.y
local frame_loop = frame_range.x .. "," .. frame_range.y
local form
if self.name == "draconis:fire_dragon" then
form = {
Expand Down Expand Up @@ -148,7 +150,7 @@ local function get_wyvern_formspec(self)
local stamina = get_perc(self.flight_stamina, 900)
-- Visuals
local frame_range = self.animations["stand"].range
local frame_loop = frame_range.x .. "," .. frame_range.y
local frame_loop = frame_range.x .. "," .. frame_range.y
local props = self:get_props()
local texture = (props and props.textures and props.textures[1]) or "blank.png"
local health_ind = "draconis_forms_health_bg.png^[lowpart:" .. health .. ":draconis_forms_health_fg.png"
Expand Down Expand Up @@ -360,4 +362,4 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
form_objref[name] = nil
end
end
end)
end)
8 changes: 5 additions & 3 deletions api/libri.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
-- Libri --
-----------

local S = draconis.S

local color = minetest.colorize

local libri_bg = {
Expand Down Expand Up @@ -409,14 +411,14 @@ end
---------------

minetest.register_craftitem("draconis:libri_draconis", {
description = "Libri Draconis",
description = S("Libri Draconis"),
inventory_image = "draconis_libri_draconis.png",
stack_max = 1,
on_place = function(itemstack, player)
local meta = itemstack:get_meta()
local desc = meta:get_string("description")
if desc:find("Bestiary") then
meta:set_string("description", "Libri Draconis")
meta:set_string("description", S("Libri Draconis"))
meta:set_string("pages", nil)
end
local name = player:get_player_name()
Expand All @@ -426,7 +428,7 @@ minetest.register_craftitem("draconis:libri_draconis", {
local meta = itemstack:get_meta()
local desc = meta:get_string("description")
if desc:find("Bestiary") then
meta:set_string("description", "Libri Draconis")
meta:set_string("description", S("Libri Draconis"))
meta:set_string("pages", nil)
end
local name = player:get_player_name()
Expand Down
24 changes: 14 additions & 10 deletions api/mount.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
-- Mount API --
---------------

local S = draconis.S

draconis.mounted_player_data = {}

local abs = math.abs
Expand Down Expand Up @@ -270,7 +272,7 @@ function draconis.detach_player(self, player)
return
end
local player_name = player:get_player_name()
local data = draconis.mounted_player_data[player_name]
local data = draconis.mounted_player_data[player_name] or {}
-- Attach Player
player:set_detach()
-- Set HUD
Expand Down Expand Up @@ -368,11 +370,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname == "draconis:dragon_mount_settings" then
if fields.btn_view_point then
draconis.aux_key_setting[name] = "pov"
minetest.chat_send_player(name, "Sprint key now changes point of view")
minetest.chat_send_player(name, S("Sprint key now changes point of view"))
end
if fields.btn_pitch_toggle then
draconis.aux_key_setting[name] = "vert_method"
minetest.chat_send_player(name, "Sprint key now changes vertical movement method")
minetest.chat_send_player(name, S("Sprint key now changes vertical movement method"))
end
end
end)
Expand All @@ -386,9 +388,9 @@ end)

minetest.register_on_dieplayer(function(player)
local name = player:get_player_name()
if name
and draconis.mounted_player_data[name] then
draconis.detach_player(draconis.mounted_player_data[name].dragon, player)
local data = draconis.mounted_player_data[name]
if data and data.dragon then
draconis.detach_player(data.dragon, player)
end
end)

Expand All @@ -411,10 +413,12 @@ local function update_hud(self, player)
local breath = self.attack_stamina / 100 * 100
local hud_data = draconis.mounted_player_data[name].huds
-- Update Elements
player:hud_remove(hud_data["health"])
player:hud_remove(hud_data["hunger"])
player:hud_remove(hud_data["stamina"])
player:hud_remove(hud_data["breath"])
if hud_data then
player:hud_remove(hud_data["health"])
player:hud_remove(hud_data["hunger"])
player:hud_remove(hud_data["stamina"])
player:hud_remove(hud_data["breath"])
end
draconis.mounted_player_data[name].huds = {
["health"] = set_hud(player, {
text = "draconis_forms_health_bg.png^[lowpart:" .. health .. ":draconis_forms_health_fg.png",
Expand Down
Loading