Compare commits
100 commits
master
...
forkhausen
Author | SHA1 | Date | |
---|---|---|---|
6a56a2924f | |||
|
95b3b4a172 | ||
|
bfd2f0ebc7 | ||
|
d1d7c026e1 | ||
|
7cfef25dfe | ||
c6b85fdf93 | |||
|
547080bd98 | ||
|
a20637f68c | ||
|
1a0e979b0c | ||
|
b512e16a7b | ||
|
26b5b45595 | ||
0f7f969d86 | |||
14dbf91ada | |||
f1f1e29d71 | |||
|
b8bd154378 | ||
|
c156398fb5 | ||
|
728db50baf | ||
|
621946546b | ||
|
ffcad31871 | ||
|
bfb1e3e447 | ||
|
d13498e6f9 | ||
|
0c96e512d7 | ||
6f30b57cbe | |||
|
555d21263d | ||
|
5108f398bb | ||
|
2ec66fc61b | ||
|
6df30dc0dc | ||
|
c3578e283c | ||
|
58013872c2 | ||
|
aeb7a6cb8b | ||
|
131051b1df | ||
ad70a71f8c | |||
|
fb55d33bfe | ||
|
94c4256451 | ||
103122866e | |||
f1df128d0c | |||
96e858644b | |||
2407529a00 | |||
ab1dbd33d5 | |||
f13366c341 | |||
6ba0b77ec8 | |||
112896743e | |||
7b4bd642e6 | |||
3566ef37fa | |||
|
e058ee8487 | ||
|
c9a37d0dbc | ||
d32c427c39 | |||
|
8c20dfa5d2 | ||
|
2b4a4f8c60 | ||
|
b59f0d6c6e | ||
|
4957bd1118 | ||
e95d8ddf3a | |||
f388983b73 | |||
a4ee8dfdd5 | |||
effa27bec1 | |||
53cb7d4edb | |||
beace10136 | |||
e7503abf55 | |||
476b36de6d | |||
84202237f8 | |||
|
02b2ff7460 | ||
|
bc740efafe | ||
|
00acbf8a2a | ||
|
56d484f69b | ||
|
6a576c50a0 | ||
|
d4bc7a2f88 | ||
313fd79612 | |||
935129d997 | |||
baaf3e7a13 | |||
d0ac1d7377 | |||
f28dc7312b | |||
baa7a8c23c | |||
|
7fa8828bd5 | ||
|
026d406d4b | ||
|
679e2b1b70 | ||
|
772ea01aff | ||
|
2b5ddbd62d | ||
|
9ee0ef5a8d | ||
|
58458b2bca | ||
|
3087621b11 | ||
|
8dd1cf6719 | ||
48e320d907 | |||
1cbebae5b8 | |||
a866070bb6 | |||
4343a5d084 | |||
008969949e | |||
|
a10dff8421 | ||
|
a62a75c799 | ||
|
64c767ad8c | ||
|
b4ea2afe77 | ||
|
cdea2eeabf | ||
|
92ab90fd1b | ||
|
6315490b14 | ||
|
8d67824e42 | ||
|
fd05259202 | ||
|
ca7c8c23c7 | ||
|
77c95fe8c3 | ||
|
1d5c11f683 | ||
|
063595ac3c | ||
|
59b6385d10 |
|
@ -5,7 +5,7 @@ Wow, thank you! :-)
|
|||
But first, some things to note:
|
||||
|
||||
MineClone 2's development target is to make a free software clone of Minecraft,
|
||||
***version 1.11*** (later: 1.12), ***PC edition***.
|
||||
***version 1.11***, ***PC edition***.
|
||||
|
||||
MineClone 2 is maintained by one person. Namely, Wuzzy. You can find me,
|
||||
Wuzzy, in the Minetest forums (forums.minetest.net), in IRC in the #minetest
|
||||
|
@ -26,8 +26,8 @@ For small and medium changes:
|
|||
|
||||
* Fork the repository
|
||||
* Do your change in a new branch
|
||||
* Upload the repository somewhere where it can be accessed from the Internet
|
||||
* Ask me to pull in your changes (and briefly say what you're changed)
|
||||
* Upload the repository somewhere where it can be accessed from the Internet and
|
||||
notify me
|
||||
|
||||
For small changes, sending me a patch is also good.
|
||||
|
||||
|
@ -35,7 +35,7 @@ For big changes: Same as above, but consider notifying me first to avoid
|
|||
duplicate work and possible tears of rejection. ;-)
|
||||
|
||||
## Quality remarks
|
||||
Again: There is ***no*** guarantee I will accept anything from anything.
|
||||
Again: There is ***no*** guarantee I will accept anything from anybody.
|
||||
But I will gladly take in code from others when I feel it saves me work
|
||||
in the long run.
|
||||
|
||||
|
@ -64,10 +64,10 @@ Depending on what you add, the chances for inclusion vary:
|
|||
|
||||
## Coding style guide
|
||||
* Indentations should reflect the code flow
|
||||
* Use tabs, not spaces for indentation
|
||||
* Use tabs, not spaces for indentation (tab size = 8)
|
||||
* Never use `minetest.env`
|
||||
|
||||
## Reporting bugs
|
||||
Report all bugs and missing Minecraft features here:
|
||||
|
||||
<https://git.minetest.land/Wuzzy/MineClone2-Bugs>
|
||||
<https://git.minetest.land/Wuzzy/MineClone2/issues>
|
||||
|
|
36
README.md
|
@ -1,8 +1,21 @@
|
|||
# MineClone 2
|
||||
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils.
|
||||
Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB.
|
||||
# MineClone 2 (Forkhausen Edition)
|
||||
An unofficial Minecraft-like game for Minetest. Forked from MineClone2 developed by Wuzzy
|
||||
and contributors which is a fork of MineClone by davedevils. Not developed or endorsed by Mojang AB.
|
||||
|
||||
Version: 0.64.0
|
||||
Version: 0.65.2
|
||||
|
||||
## Differences to MineClone 2
|
||||
So far some minor fixes that I also sent upstream to Wuzzy for inclusion and some yet unmerged features from others:
|
||||
|
||||
* ~~Fix a crash when refueling powered minecarts [issue #683](https://git.minetest.land/Wuzzy/MineClone2/issues/683)~~
|
||||
* Pumpkins grow without a face and can be carved [issue #682](https://git.minetest.land/Wuzzy/MineClone2/issues/682)
|
||||
* Fix acceleration of powered minecarts and powered rails not summing up (by 2mac)
|
||||
[issue #658](https://git.minetest.land/Wuzzy/MineClone2/issues/658).
|
||||
* Mobs take damage from magma block if susceptible to fire damage (inspiraton from [minetest_npc](https://forum.minetest.net/viewtopic.php?p=371969#p371969))
|
||||
* ~~When mobs are trying to escape dangerous situations (e.g. standing on lava), make more efforts to check if destination is safe.~~
|
||||
* Carpets can be added to tamed Llamas. TODO: Replace textures because community-provided PixelPerfection textures of carpets are a bit **too** close to the original MC textures.
|
||||
* ~~Fix crash in new explosion API [issue #689](https://git.minetest.land/Wuzzy/MineClone2/issues/689)~~
|
||||
* Fix crash when igniting a creeper with flint and steel ([fix by nelkat](https://forum.minetest.net/viewtopic.php?p=372836#p372836))
|
||||
|
||||
### Gameplay
|
||||
You start in a randomly-generated world made entirely of cubes. You can explore
|
||||
|
@ -182,7 +195,7 @@ Technical differences from Minecraft:
|
|||
## Reporting bugs
|
||||
Please report all bugs and missing Minecraft features here:
|
||||
|
||||
<https://git.minetest.land/Wuzzy/MineClone2/issues>
|
||||
<https://git.athemis.de/Athemis/MineClone2/issues>
|
||||
|
||||
## Other readme files
|
||||
|
||||
|
@ -200,15 +213,22 @@ There are so many people to list (sorry). Check out the respective mod directori
|
|||
* [ex-bart](https://github.com/ex-bart): Redstone comparators
|
||||
* [Rootyjr](https://github.com/Rootyjr): Fishing rod and bugfixes
|
||||
* [aligator](https://github.com/aligator): Improvement of doors
|
||||
* [ryvnf](https://github.com/ryvnf): Explosion mechanics
|
||||
* Lots of other people: TO BE WRITTEN (see mod directories for details)
|
||||
|
||||
### Textures
|
||||
### Graphics
|
||||
* [XSSheep](http://www.minecraftforum.net/members/XSSheep): Main author; creator of the Pixel Perfection resource pack of Minecraft 1.11
|
||||
* [Wuzzy](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=3082): Main menu imagery and various edits and additions of texture pack
|
||||
* [kingoscargames](https://github.com/kingoscargames): Various edits and additions of existing textures
|
||||
* [leorockway](https://github.com/leorockway): Some edits of mob textures
|
||||
* [xMrVizzy](https://minecraft.curseforge.com/members/xMrVizzy): Glazed terracotta (textures are subject to be replaced later)
|
||||
* Other authors: GUI images,
|
||||
* yutyo <tanakinci2002@gmail.com>: MineClone 2 logo
|
||||
* Other authors: GUI images
|
||||
|
||||
### Translations
|
||||
* Wuzzy: German
|
||||
* Rocher Laurent <rocherl@club-internet.fr>: French
|
||||
* wuniversales: Spanish
|
||||
|
||||
### Models
|
||||
* [22i](https://github.com/22i): Creator of all models
|
||||
|
@ -249,6 +269,8 @@ project by davedevils which fell under the same license.
|
|||
|
||||
Mods credit:
|
||||
See `README.txt` or `README.md` in each mod directory for information about other authors.
|
||||
For mods that do not have such a file, the license is the source code license
|
||||
of MineClone 2 and the author is Wuzzy.
|
||||
|
||||
### License of media (textures and sounds)
|
||||
No non-free licenses are used anywhere.
|
||||
|
|
BIN
menu/header.png
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 22 KiB |
383
mods/CORE/mcl_explosions/init.lua
Normal file
|
@ -0,0 +1,383 @@
|
|||
--[[
|
||||
Explosion API mod for Minetest (adapted to MineClone 2)
|
||||
|
||||
This mod is based on the Minetest explosion API mod, but has been changed
|
||||
to have the same explosion mechanics as Minecraft and work with MineClone.
|
||||
The computation-intensive parts of the mod has been optimized to allow for
|
||||
larger explosions and faster world updating.
|
||||
|
||||
This mod was created by Elias Astrom <ryvnf@riseup.net> and is released
|
||||
under the LGPLv2.1 license.
|
||||
--]]
|
||||
|
||||
mcl_explosions = {}
|
||||
|
||||
local creative_mode = minetest.settings:get_bool("creative_mode")
|
||||
local mod_death_messages = minetest.get_modpath("mcl_death_messages") ~= nil
|
||||
local mod_fire = minetest.get_modpath("mcl_fire") ~= nil
|
||||
local CONTENT_FIRE = minetest.get_content_id("mcl_fire:fire")
|
||||
|
||||
local S = minetest.get_translator("mcl_explosions")
|
||||
|
||||
-- Saved sphere explosion shapes for various radiuses
|
||||
local sphere_shapes = {}
|
||||
|
||||
-- Saved node definitions in table using cid-keys for faster look-up.
|
||||
local node_blastres = {}
|
||||
local node_on_blast = {}
|
||||
local node_walkable = {}
|
||||
|
||||
-- The step length for the rays (Minecraft uses 0.3)
|
||||
local STEP_LENGTH = 0.3
|
||||
|
||||
-- How many rays to compute entity exposure to explosion
|
||||
local N_EXPOSURE_RAYS = 16
|
||||
|
||||
minetest.register_on_mods_loaded(function()
|
||||
-- Store blast resistance values by content ids to improve performance.
|
||||
for name, def in pairs(minetest.registered_nodes) do
|
||||
node_blastres[minetest.get_content_id(name)] = def._mcl_blast_resistance or 0
|
||||
node_on_blast[minetest.get_content_id(name)] = def.on_blast
|
||||
node_walkable[minetest.get_content_id(name)] = def.walkable
|
||||
end
|
||||
end)
|
||||
|
||||
-- Compute the rays which make up a sphere with radius. Returns a list of rays
|
||||
-- which can be used to trace explosions. This function is not efficient
|
||||
-- (especially for larger radiuses), so the generated rays for various radiuses
|
||||
-- should be cached and reused.
|
||||
--
|
||||
-- Should be possible to improve by using a midpoint circle algorithm multiple
|
||||
-- times to create the sphere, currently uses more of a brute-force approach.
|
||||
local function compute_sphere_rays(radius)
|
||||
local rays = {}
|
||||
local sphere = {}
|
||||
|
||||
for i=1, 2 do
|
||||
for y = -radius, radius do
|
||||
for z = -radius, radius do
|
||||
for x = -radius, 0, 1 do
|
||||
local d = x * x + y * y + z * z
|
||||
if d <= radius * radius then
|
||||
local pos = { x = x, y = y, z = z }
|
||||
sphere[minetest.hash_node_position(pos)] = pos
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i=1,2 do
|
||||
for x = -radius, radius do
|
||||
for z = -radius, radius do
|
||||
for y = -radius, 0, 1 do
|
||||
local d = x * x + y * y + z * z
|
||||
if d <= radius * radius then
|
||||
local pos = { x = x, y = y, z = z }
|
||||
sphere[minetest.hash_node_position(pos)] = pos
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i=1,2 do
|
||||
for x = -radius, radius do
|
||||
for y = -radius, radius do
|
||||
for z = -radius, 0, 1 do
|
||||
local d = x * x + y * y + z * z
|
||||
if d <= radius * radius then
|
||||
local pos = { x = x, y = y, z = z }
|
||||
sphere[minetest.hash_node_position(pos)] = pos
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for _, pos in pairs(sphere) do
|
||||
rays[#rays + 1] = vector.normalize(pos)
|
||||
end
|
||||
|
||||
return rays
|
||||
end
|
||||
|
||||
-- Add particles from explosion
|
||||
--
|
||||
-- Parameters:
|
||||
-- pos - The position of the explosion
|
||||
-- radius - The radius of the explosion
|
||||
local function add_particles(pos, radius)
|
||||
minetest.add_particlespawner({
|
||||
amount = 64,
|
||||
time = 0.125,
|
||||
minpos = pos,
|
||||
maxpos = pos,
|
||||
minvel = {x = -radius, y = -radius, z = -radius},
|
||||
maxvel = {x = radius, y = radius, z = radius},
|
||||
minacc = vector.new(),
|
||||
maxacc = vector.new(),
|
||||
minexptime = 0.5,
|
||||
maxexptime = 1.0,
|
||||
minsize = radius * 0.5,
|
||||
maxsize = radius * 1.0,
|
||||
texture = "tnt_smoke.png",
|
||||
})
|
||||
end
|
||||
|
||||
-- Traces the rays of an explosion, and updates the environment.
|
||||
--
|
||||
-- Parameters:
|
||||
-- pos - Where the rays in the explosion should start from
|
||||
-- strength - The strength of each ray
|
||||
-- raydirs - The directions for each ray
|
||||
-- radius - The maximum distance each ray will go
|
||||
-- drop_chance - The chance that destroyed nodes will drop their items
|
||||
-- fire - If true, 1/3 of destroyed nodes become fire
|
||||
-- puncher - object that punches other objects (optional)
|
||||
--
|
||||
-- Note that this function has been optimized, it contains code which has been
|
||||
-- inlined to avoid function calls and unnecessary table creation. This was
|
||||
-- measured to give a significant performance increase.
|
||||
local function trace_explode(pos, strength, raydirs, radius, drop_chance, fire, puncher)
|
||||
local vm = minetest.get_voxel_manip()
|
||||
|
||||
local emin, emax = vm:read_from_map(vector.subtract(pos, radius),
|
||||
vector.add(pos, radius))
|
||||
local emin_x = emin.x
|
||||
local emin_y = emin.y
|
||||
local emin_z = emin.z
|
||||
|
||||
local ystride = (emax.x - emin_x + 1)
|
||||
local zstride = ystride * (emax.y - emin_y + 1)
|
||||
local pos_x = pos.x
|
||||
local pos_y = pos.y
|
||||
local pos_z = pos.z
|
||||
|
||||
local area = VoxelArea:new {
|
||||
MinEdge = emin,
|
||||
MaxEdge = emax
|
||||
}
|
||||
local data = vm:get_data()
|
||||
local destroy = {}
|
||||
|
||||
-- Trace rays for environment destruction
|
||||
for i = 1, #raydirs do
|
||||
local rpos_x = pos.x
|
||||
local rpos_y = pos.y
|
||||
local rpos_z = pos.z
|
||||
local rdir_x = raydirs[i].x
|
||||
local rdir_y = raydirs[i].y
|
||||
local rdir_z = raydirs[i].z
|
||||
local rstr = (0.7 + math.random() * 0.6) * strength
|
||||
|
||||
for r = 0, math.ceil(radius * (1.0 / STEP_LENGTH)) do
|
||||
local npos_x = math.floor(rpos_x + 0.5)
|
||||
local npos_y = math.floor(rpos_y + 0.5)
|
||||
local npos_z = math.floor(rpos_z + 0.5)
|
||||
local idx = (npos_z - emin_z) * zstride + (npos_y - emin_y) * ystride +
|
||||
npos_x - emin_x + 1
|
||||
|
||||
local cid = data[idx]
|
||||
local br = node_blastres[cid]
|
||||
local hash = (npos_z + 32768) * 65536 * 65536 +
|
||||
(npos_y + 32768) * 65536 +
|
||||
npos_x + 32768
|
||||
|
||||
rpos_x = rpos_x + STEP_LENGTH * rdir_x
|
||||
rpos_y = rpos_y + STEP_LENGTH * rdir_y
|
||||
rpos_z = rpos_z + STEP_LENGTH * rdir_z
|
||||
|
||||
rstr = rstr - 0.75 * STEP_LENGTH - (br + 0.3) * STEP_LENGTH
|
||||
|
||||
if rstr <= 0 then
|
||||
break
|
||||
end
|
||||
|
||||
if cid ~= minetest.CONTENT_AIR then
|
||||
destroy[hash] = idx
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Entities in radius of explosion
|
||||
local punch_radius = 2 * strength
|
||||
local objs = minetest.get_objects_inside_radius(pos, punch_radius)
|
||||
|
||||
-- Trace rays for entity damage
|
||||
for _, obj in pairs(objs) do
|
||||
local ent = obj:get_luaentity()
|
||||
|
||||
-- Ignore items to lower lag
|
||||
if obj:is_player() or (ent and ent.name ~= '__builtin.item') then
|
||||
local opos = obj:get_pos()
|
||||
local collisionbox = nil
|
||||
|
||||
if obj:is_player() then
|
||||
collisionbox = { -0.3, 0.0, -0.3, 0.3, 1.77, 0.3 }
|
||||
elseif ent.name then
|
||||
local def = minetest.registered_entities[ent.name]
|
||||
collisionbox = def.collisionbox
|
||||
end
|
||||
|
||||
if collisionbox then
|
||||
-- Create rays from random points in the collision box
|
||||
local x1 = collisionbox[1] * 2
|
||||
local y1 = collisionbox[2] * 2
|
||||
local z1 = collisionbox[3] * 2
|
||||
local x2 = collisionbox[4] * 2
|
||||
local y2 = collisionbox[5] * 2
|
||||
local z2 = collisionbox[6] * 2
|
||||
local x_len = math.abs(x2 - x1)
|
||||
local y_len = math.abs(y2 - y1)
|
||||
local z_len = math.abs(z2 - z1)
|
||||
|
||||
-- Move object position to the center of its bounding box
|
||||
opos.x = opos.x + x1 + x2
|
||||
opos.y = opos.y + y1 + y2
|
||||
opos.z = opos.z + z1 + z2
|
||||
|
||||
-- Count number of rays from collision box which are unobstructed
|
||||
local count = N_EXPOSURE_RAYS
|
||||
|
||||
for i = 1, N_EXPOSURE_RAYS do
|
||||
local rpos_x = opos.x + math.random() * x_len - x_len / 2
|
||||
local rpos_y = opos.y + math.random() * y_len - y_len / 2
|
||||
local rpos_z = opos.z + math.random() * z_len - z_len / 2
|
||||
local rdir_x = pos.x - rpos_x
|
||||
local rdir_y = pos.y - rpos_y
|
||||
local rdir_z = pos.z - rpos_z
|
||||
local rdir_len = math.hypot(rdir_x, math.hypot(rdir_y, rdir_z))
|
||||
rdir_x = rdir_x / rdir_len
|
||||
rdir_y = rdir_y / rdir_len
|
||||
rdir_z = rdir_z / rdir_len
|
||||
|
||||
for i=0, rdir_len / STEP_LENGTH do
|
||||
rpos_x = rpos_x + rdir_x * STEP_LENGTH
|
||||
rpos_y = rpos_y + rdir_y * STEP_LENGTH
|
||||
rpos_z = rpos_z + rdir_z * STEP_LENGTH
|
||||
local npos_x = math.floor(rpos_x + 0.5)
|
||||
local npos_y = math.floor(rpos_y + 0.5)
|
||||
local npos_z = math.floor(rpos_z + 0.5)
|
||||
local idx = (npos_z - emin_z) * zstride + (npos_y - emin_y) * ystride +
|
||||
npos_x - emin_x + 1
|
||||
|
||||
|
||||
local cid = data[idx]
|
||||
local walkable = node_walkable[cid]
|
||||
|
||||
if walkable then
|
||||
count = count - 1
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Punch entity with damage depending on explosion exposure and
|
||||
-- distance to explosion
|
||||
local exposure = count / N_EXPOSURE_RAYS
|
||||
local punch_vec = vector.subtract(opos, pos)
|
||||
local punch_dir = vector.normalize(punch_vec)
|
||||
local impact = (1 - vector.length(punch_vec) / punch_radius) * exposure
|
||||
if impact < 0 then
|
||||
impact = 0
|
||||
end
|
||||
local damage = math.floor((impact * impact + impact) * 7 * strength + 1)
|
||||
if mod_death_messages and obj:is_player() then
|
||||
mcl_death_messages.player_damage(obj, S("@1 was caught in an explosion.", obj:get_player_name()))
|
||||
end
|
||||
local source = puncher
|
||||
if not source then
|
||||
source = obj
|
||||
end
|
||||
obj:punch(source, 10, { damage_groups = { full_punch_interval = 1,
|
||||
fleshy = damage, knockback = impact * 20.0 } }, punch_dir)
|
||||
|
||||
if obj:is_player() then
|
||||
obj:add_player_velocity(vector.multiply(punch_dir, impact * 20))
|
||||
elseif ent.tnt_knockback then
|
||||
obj:add_velocity(vector.multiply(punch_dir, impact * 20))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Remove destroyed blocks and drop items
|
||||
for hash, idx in pairs(destroy) do
|
||||
local do_drop = not creative_mode and math.random() <= drop_chance
|
||||
local on_blast = node_on_blast[data[idx]]
|
||||
local remove = true
|
||||
|
||||
if do_drop or on_blast ~= nil then
|
||||
local npos = minetest.get_position_from_hash(hash)
|
||||
if on_blast ~= nil then
|
||||
remove = on_blast(npos, 1.0)
|
||||
else
|
||||
local name = minetest.get_name_from_content_id(data[idx])
|
||||
local drop = minetest.get_node_drops(name, "")
|
||||
|
||||
for _, item in ipairs(drop) do
|
||||
if type(item) ~= "string" then
|
||||
item = item:get_name() .. item:get_count()
|
||||
end
|
||||
minetest.add_item(npos, item)
|
||||
end
|
||||
end
|
||||
end
|
||||
if remove then
|
||||
if mod_fire and fire and math.random(1, 3) == 1 then
|
||||
data[idx] = CONTENT_FIRE
|
||||
else
|
||||
data[idx] = minetest.CONTENT_AIR
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Log explosion
|
||||
minetest.log('action', 'Explosion at ' .. minetest.pos_to_string(pos) ..
|
||||
' with strength ' .. strength .. ' and radius ' .. radius)
|
||||
|
||||
-- Update environment
|
||||
vm:set_data(data)
|
||||
vm:write_to_map(data)
|
||||
vm:update_liquids()
|
||||
end
|
||||
|
||||
-- Create an explosion with strength at pos.
|
||||
--
|
||||
-- Parameters:
|
||||
-- pos - The position where the explosion originates from
|
||||
-- strength - The blast strength of the explosion (a TNT explosion uses 4)
|
||||
-- info - Table containing information about explosion.
|
||||
-- puncher - object that is reported as source of punches/damage (optional)
|
||||
--
|
||||
-- Values in info:
|
||||
-- drop_chance - If specified becomes the drop chance of all nodes in the
|
||||
-- explosion (defaults to 1.0 / strength)
|
||||
-- no_sound - If true then the explosion will not play a sound
|
||||
-- no_particle - If true then the explosion will not create particles
|
||||
-- fire - If true, 1/3 nodes become fire (default: false)
|
||||
function mcl_explosions.explode(pos, strength, info, puncher)
|
||||
-- The maximum blast radius (in the air)
|
||||
local radius = math.ceil(1.3 * strength / (0.3 * 0.75) * 0.3)
|
||||
|
||||
if not sphere_shapes[radius] then
|
||||
sphere_shapes[radius] = compute_sphere_rays(radius)
|
||||
end
|
||||
local shape = sphere_shapes[radius]
|
||||
|
||||
trace_explode(pos, strength, shape, radius, (info and info.drop_chance) or 1 / strength, info.fire == true, puncher)
|
||||
|
||||
if not (info and info.no_sound) then
|
||||
add_particles(pos, radius)
|
||||
end
|
||||
if not (info and info.no_particle) then
|
||||
minetest.sound_play("tnt_explode", {
|
||||
pos = pos, gain = 1.0,
|
||||
max_hear_distance = strength * 16
|
||||
}, true)
|
||||
end
|
||||
end
|
2
mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr
Normal file
|
@ -0,0 +1,2 @@
|
|||
# textdomain:mcl_explosions
|
||||
@1 was caught in an explosion.=@1 wurde Opfer einer Explosion.
|
2
mods/CORE/mcl_explosions/locale/template.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
# textdomain:mcl_explosions
|
||||
@1 was caught in an explosion.=
|
3
mods/CORE/mcl_explosions/mod.conf
Normal file
|
@ -0,0 +1,3 @@
|
|||
name = mcl_explosions
|
||||
description = A common API to create explosions.
|
||||
optional_depends = mcl_fire
|
Before Width: | Height: | Size: 938 B After Width: | Height: | Size: 171 B |
|
@ -1,11 +1,11 @@
|
|||
WalkOver
|
||||
Walkover
|
||||
--------
|
||||
|
||||
Some mode developers have shown an interest in having an on_walk_over event. This is useful for pressure-plates and the like.
|
||||
Some mode developers have shown an interest in having an `on_walk_over` event. This is useful for pressure-plates and the like.
|
||||
|
||||
See this issue - https://github.com/minetest/minetest/issues/247
|
||||
|
||||
I have implemented a server_side version in lua using globalstep which people might find useful. Of course this would better implemented via a client-based "on walk over", but it is sufficient for my needs now.
|
||||
I have implemented a server-side version in Lua using globalstep which people might find useful. Of course this would better implemented via a client-based "on walk over", but it is sufficient for my needs now.
|
||||
|
||||
Example Usage
|
||||
-------------
|
||||
|
@ -19,3 +19,6 @@ Example Usage
|
|||
})
|
||||
|
||||
|
||||
Credits
|
||||
-------
|
||||
Mod created by lordfingle, licensed under Apache License 2.0.
|
||||
|
|
|
@ -10,8 +10,7 @@ License of boat model:
|
|||
GNU GPLv3 <https://www.gnu.org/licenses/gpl-3.0.html>
|
||||
|
||||
## Textures
|
||||
All textures are from the Faithful texture pack for Minecraft.
|
||||
See the main MineClone 2 license to learn more.
|
||||
See the main MineClone 2 README.md file to learn more.
|
||||
|
||||
## Code
|
||||
Code based on Minetest Game, licensed under the MIT License (MIT).
|
||||
|
|
11
mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr
Normal file
|
@ -0,0 +1,11 @@
|
|||
# textdomain: mcl_boats
|
||||
Acacia Boat=Bateau en Acacia
|
||||
Birch Boat=Bateau en Bouleau
|
||||
Boat=Bateau
|
||||
Boats are used to travel on the surface of water.=Les bateaux sont utilisés pour voyager à la surface de l'eau.
|
||||
Dark Oak Boat=Bateau en Chêne Noir
|
||||
Jungle Boat=Bateau en Acajou
|
||||
Oak Boat=Bateau en Chêne
|
||||
Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Faites un clic droit sur une source d'eau pour placer le bateau. Faites un clic droit sur le bateau pour y entrer. Utilisez [Gauche] et [Droite] pour diriger, [Avant] pour accélérer et [Arrière] pour ralentir ou reculer. Cliquez de nouveau avec le bouton droit sur le bateau pour le quitter, frappez le bateau pour le faire tomber en tant qu'objet.
|
||||
Spruce Boat=Bateau en Sapin
|
||||
Water vehicle=Véhicule aquatique
|
Before Width: | Height: | Size: 265 B After Width: | Height: | Size: 258 B |
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 258 B |
Before Width: | Height: | Size: 267 B After Width: | Height: | Size: 259 B |
|
@ -0,0 +1,3 @@
|
|||
# textdomain: mcl_falling_nodes
|
||||
@1 was smashed by a falling anvil.=@1 a été écrasé par une enclume qui tombait.
|
||||
@1 was smashed by a falling block.=@1 a été écrasé par un bloc qui tombait.
|
|
@ -3,12 +3,6 @@ mcl_minecarts
|
|||
Based on the mod "boost_carts" by Krock.
|
||||
Target: Run smoothly and do not use too much CPU.
|
||||
|
||||
TODO:
|
||||
- Minecraft-like physics
|
||||
- Add activator rail
|
||||
- Add more rail textures
|
||||
- Add loaded minecarts
|
||||
|
||||
License of source code:
|
||||
-----------------------
|
||||
MIT License
|
||||
|
@ -23,10 +17,5 @@ Authors/licenses of media files:
|
|||
Minecart model:
|
||||
22i (GPLv3)
|
||||
|
||||
Wuzzy (based on Pixel Perfection 1.11, MIT License):
|
||||
carts_rail_crossing_pwr.png
|
||||
carts_rail_curved_pwr.png
|
||||
carts_rail_t_junction_pwr.png
|
||||
|
||||
Other texture files (CC BY-SA 3.0:
|
||||
Texture files (CC BY-SA 3.0):
|
||||
XSSheep
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
mcl_explosions
|
||||
mcl_core
|
||||
mcl_sounds
|
||||
mcl_player
|
||||
|
|
|
@ -206,7 +206,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o
|
|||
-- Explode if already ignited
|
||||
if self._boomtimer then
|
||||
self.object:remove()
|
||||
tnt.boom(pos)
|
||||
mcl_explosions.explode(pos, 4, { drop_chance = 1.0 })
|
||||
return
|
||||
end
|
||||
|
||||
|
@ -249,7 +249,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o
|
|||
local pos = self.object:get_pos()
|
||||
if self._boomtimer <= 0 then
|
||||
self.object:remove()
|
||||
tnt.boom(pos)
|
||||
mcl_explosions.explode(pos, 4, { drop_chance = 1.0 })
|
||||
return
|
||||
else
|
||||
tnt.smoke_step(pos)
|
||||
|
@ -309,7 +309,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o
|
|||
if not rou_pos then
|
||||
rou_pos = vector.round(pos)
|
||||
end
|
||||
rou_old = vector.round(self._old_pos)
|
||||
local rou_old = vector.round(self._old_pos)
|
||||
if not node then
|
||||
node = minetest.get_node(rou_pos)
|
||||
end
|
||||
|
@ -409,14 +409,17 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o
|
|||
|
||||
-- Slow down or speed up
|
||||
local acc = dir.y * -1.8
|
||||
|
||||
local friction = 0.4
|
||||
local speed_mod = minetest.registered_nodes[minetest.get_node(pos).name]._rail_acceleration
|
||||
|
||||
acc = acc - friction
|
||||
|
||||
if has_fuel then
|
||||
acc = acc + 0.2
|
||||
elseif speed_mod and speed_mod ~= 0 then
|
||||
acc = acc + speed_mod
|
||||
else
|
||||
acc = acc - 0.4
|
||||
acc = acc + 0.6
|
||||
end
|
||||
|
||||
if speed_mod and speed_mod ~= 0 then
|
||||
acc = acc + speed_mod + friction
|
||||
end
|
||||
|
||||
new_acc = vector.multiply(dir, acc)
|
||||
|
|
35
mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr
Normal file
|
@ -0,0 +1,35 @@
|
|||
# textdomain: mcl_minecarts
|
||||
Minecart=Wagonnet
|
||||
Minecarts can be used for a quick transportion on rails.=Les wagonnets peuvent être utilisés pour un transport rapide sur rails.
|
||||
Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Les wagonnets roulent uniquement sur des rails et suivent toujours les pistes. À un carrefour en T sans voie directe, ils tournent à gauche. La vitesse dépend du type de rail.
|
||||
You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Vous pouvez placer le wagonnet sur des rails. Faites un clic droit dessus pour entrer dedans. Frappez-le pour le faire bouger.
|
||||
To obtain the minecart, punch it while holding down the sneak key.=Pour obtenir la wagonnet, frappez-le tout en maintenant la touche furtive enfoncée.
|
||||
A minecart with TNT is an explosive vehicle that travels on rail.=Un wagonnet avec de la TNT est un véhicule explosif qui se déplace sur rail.
|
||||
Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Placez-le sur des rails. Frappez-le pour le déplacer. Le TNT est allumé avec un briquet ou lorsque le minecart est sur un rail d'activation alimenté.
|
||||
To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Pour obtenir la wagonnet et la TNT, frappez-les tout en maintenant la touche furtive enfoncée. Vous ne pouvez pas faire cela si le TNT a été allumé.
|
||||
A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Une wagonnet avec un four est un véhicule qui se déplace sur rails. Il peut se propulser avec du carburant.
|
||||
Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Placez-le sur des rails. Si vous lui donnez du charbon, le four commencera à brûler pendant longtemps et le wagonnet pourra se déplacer. Frappez-le pour le faire bouger.
|
||||
To obtain the minecart and furnace, punch them while holding down the sneak key.=Pour obtenir le wagonnet et le four, frappez-les tout en maintenant la touche furtive enfoncée.
|
||||
Minecart with Chest=Wagonnet avec Coffre
|
||||
Minecart with Furnace=Wagonnet avec Four
|
||||
Minecart with Command Block=Wagonnet avec Bloc de Commande
|
||||
Minecart with Hopper=Wagonnet avec Entonoir
|
||||
Minecart with TNT=Wagonnet avec TNT
|
||||
Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Placez-les sur le sol pour construire votre chemin de fer, les rails se connecteront automatiquement les uns aux autres et se transformeront en courbes, en jonctions en T, en traversées et en pentes au besoin.
|
||||
Rail=Rail
|
||||
Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Les rails ralentissent légèrement les wagonnets en raison de la friction.
|
||||
Powered Rail=Rail allimenté
|
||||
Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Les rails motorisés sont capables d'accélérer et de freiner les wagonnets.
|
||||
Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Sans énergie de redstone, le rail freinera les wagonnets. Pour que ce rail accélère les minecarts, alimentez-le avec une source d'énergie redstone.
|
||||
Activator Rail=Rail d'activation
|
||||
Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Des rails activateurs sont utilisés pour activer des wagonnets spéciaux.
|
||||
To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Pour activer ce rail, activez les wagonnets, alimentez-le avec de l'énergie redstone et envoyez un wagonnet sur ce morceau de rail.
|
||||
Detector Rail=Rail de détection
|
||||
Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Un rail de détection est capable de détecter un wagonnet au-dessus et alimente les mécanismes de redstone.
|
||||
To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Pour détecter un wagonnet et fournir une alimentation redstone, connectez-le aux câble redstone ou aux mécanismes redstone et envoyez n'importe quel wagonnet sur le rail.
|
||||
Track for minecarts=Piste pour wagonnets
|
||||
Speed up when powered, slow down when not powered=Accélérez lorsqu'il est alimenté, ralentissez lorsqu'il n'est pas alimenté
|
||||
Activates minecarts when powered=Active les wagonnets lorsqu'il est alimenté
|
||||
Emits redstone power when a minecart is detected=Émet de l'énergie redstone lorsqu'un wagonnet est détecté
|
||||
Vehicle for fast travel on rails=Véhicule pour voyager rapidement sur rails
|
||||
Can be ignited by tools or powered activator rail=Peut être allumé par des outils ou un rail d'activation motorisé
|
Before Width: | Height: | Size: 271 B After Width: | Height: | Size: 260 B |
Before Width: | Height: | Size: 285 B After Width: | Height: | Size: 282 B |
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 273 B |
Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 270 B |
Before Width: | Height: | Size: 259 B After Width: | Height: | Size: 258 B |
Before Width: | Height: | Size: 260 B After Width: | Height: | Size: 258 B |
Before Width: | Height: | Size: 257 B After Width: | Height: | Size: 255 B |
|
@ -93,7 +93,7 @@ local node_snow = "mcl_core:snow"
|
|||
mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt"
|
||||
|
||||
local mod_weather = minetest.get_modpath("mcl_weather") ~= nil
|
||||
local mod_tnt = minetest.get_modpath("mcl_tnt") ~= nil
|
||||
local mod_explosions = minetest.get_modpath("mcl_explosions") ~= nil
|
||||
local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil
|
||||
local mod_hunger = minetest.get_modpath("mcl_hunger") ~= nil
|
||||
local mod_worlds = minetest.get_modpath("mcl_worlds") ~= nil
|
||||
|
@ -311,13 +311,17 @@ local is_node_dangerous = function(self, nodename)
|
|||
end
|
||||
end
|
||||
if self.fire_damage > 0 then
|
||||
if minetest.get_item_group(nn, "fire") ~= 0 then
|
||||
if (minetest.get_item_group(nn, "fire") ~= 0) or nn == "mcl_nether:magma" then
|
||||
return true
|
||||
end
|
||||
end
|
||||
if minetest.registered_nodes[nn].drowning > 0 then
|
||||
if self.breath_max ~= -1 then
|
||||
return true
|
||||
-- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case
|
||||
-- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous
|
||||
if not self.breathes_in_water and minetest.get_item_group(nn, "water") ~= 0 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
if minetest.registered_nodes[nn].damage_per_second > 0 then
|
||||
|
@ -855,17 +859,21 @@ local do_env_damage = function(self)
|
|||
|
||||
-- fire damage
|
||||
elseif self.fire_damage > 0
|
||||
and (nodef.groups.fire) then
|
||||
and (nodef.groups.fire) or self.standing_on == "mcl_nether:magma" then
|
||||
|
||||
if self.fire_damage ~= 0 then
|
||||
|
||||
self.health = self.health - self.fire_damage
|
||||
if self.standing_on ~= "mcl_nether:magma" then
|
||||
effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil)
|
||||
|
||||
effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil)
|
||||
|
||||
if check_for_death(self, "fire", {type = "environment",
|
||||
if check_for_death(self, "fire", {type = "environment",
|
||||
pos = pos, node = self.standing_in}) then
|
||||
return true
|
||||
end
|
||||
elseif check_for_death(self, "water", {type = "environment",
|
||||
pos = pos, node = self.standing_in}) then
|
||||
return true
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -925,14 +933,25 @@ local do_env_damage = function(self)
|
|||
and (nodef.groups.disable_suffocation ~= 1)
|
||||
and (nodef.groups.opaque == 1) then
|
||||
|
||||
-- 2 damage per second
|
||||
-- TODO: Deal this damage once every 1/2 second
|
||||
self.health = self.health - 2
|
||||
-- Short grace period before starting to take suffocation damage.
|
||||
-- This is different from players, who take damage instantly.
|
||||
-- This has been done because mobs might briefly be inside solid nodes
|
||||
-- when e.g. climbing up stairs.
|
||||
-- This is a bit hacky because it assumes that do_env_damage
|
||||
-- is called roughly every second only.
|
||||
self.suffocation_timer = self.suffocation_timer + 1
|
||||
if self.suffocation_timer >= 3 then
|
||||
-- 2 damage per second
|
||||
-- TODO: Deal this damage once every 1/2 second
|
||||
self.health = self.health - 2
|
||||
|
||||
if check_for_death(self, "suffocation", {type = "environment",
|
||||
pos = pos, node = self.standing_in}) then
|
||||
return true
|
||||
if check_for_death(self, "suffocation", {type = "environment",
|
||||
pos = pos, node = self.standing_in}) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
else
|
||||
self.suffocation_timer = 0
|
||||
end
|
||||
|
||||
return check_for_death(self, "", {type = "unknown"})
|
||||
|
@ -2022,17 +2041,25 @@ local do_states = function(self, dtime)
|
|||
|
||||
elseif self.fire_damage > 0 then
|
||||
|
||||
lp = minetest.find_node_near(s, 1, {"group:fire"})
|
||||
lp = minetest.find_node_near(s, 1, {"group:fire", "mcl_nether:magma"})
|
||||
|
||||
end
|
||||
|
||||
local is_in_danger = false
|
||||
if lp then
|
||||
-- If mob in or on dangerous block, look for land
|
||||
if (is_node_dangerous(self, self.standing_in) or
|
||||
is_node_dangerous(self, self.standing_on)) then
|
||||
is_in_danger = true
|
||||
|
||||
local is_in_danger = false
|
||||
|
||||
-- if mob is flying, only check for node it is currently in (no contact with node below)
|
||||
if flight_check(self) then
|
||||
is_in_danger = is_node_dangerous(self, self.standing_in)
|
||||
elseif (is_node_dangerous(self, self.standing_in) or
|
||||
is_node_dangerous(self, self.standing_on)) then
|
||||
is_in_danger = true
|
||||
end
|
||||
|
||||
-- If mob in or on dangerous block, look for land
|
||||
if is_in_danger then
|
||||
lp = minetest.find_node_near(s, 5, {"group:solid"})
|
||||
|
||||
-- did we find land?
|
||||
|
@ -2218,26 +2245,10 @@ local do_states = function(self, dtime)
|
|||
|
||||
local pos = self.object:get_pos()
|
||||
|
||||
-- dont damage anything if area protected or next to water
|
||||
if minetest.find_node_near(pos, 1, {"group:water"})
|
||||
or minetest.is_protected(pos, "") then
|
||||
|
||||
node_break_radius = 1
|
||||
end
|
||||
|
||||
self.object:remove()
|
||||
|
||||
if mobs_griefing and mod_tnt and tnt and tnt.boom
|
||||
and not minetest.is_protected(pos, "") then
|
||||
|
||||
tnt.boom(pos, {
|
||||
radius = node_break_radius,
|
||||
damage_radius = entity_damage_radius,
|
||||
sound = self.sounds.explode,
|
||||
is_tnt = false,
|
||||
})
|
||||
if mod_explosions then
|
||||
if mobs_griefing and not minetest.is_protected(pos, "") then
|
||||
mcl_explosions.explode(self.object:get_pos(), self.explosion_strength, { drop_chance = 1.0 }, self.object)
|
||||
else
|
||||
|
||||
minetest.sound_play(self.sounds.explode, {
|
||||
pos = pos,
|
||||
gain = 1.0,
|
||||
|
@ -2247,6 +2258,8 @@ local do_states = function(self, dtime)
|
|||
entity_physics(pos, entity_damage_radius)
|
||||
effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0)
|
||||
end
|
||||
end
|
||||
self.object:remove()
|
||||
|
||||
return true
|
||||
end
|
||||
|
@ -2742,7 +2755,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
|
|||
|
||||
self.object:set_velocity({
|
||||
x = dir.x * kb,
|
||||
y = up,
|
||||
y = dir.y * kb + up,
|
||||
z = dir.z * kb
|
||||
})
|
||||
|
||||
|
@ -3347,7 +3360,7 @@ minetest.register_entity(name, {
|
|||
replace_offset = def.replace_offset or 0,
|
||||
on_replace = def.on_replace,
|
||||
timer = 0,
|
||||
env_damage_timer = 0, -- only used when state = "attack"
|
||||
env_damage_timer = 0,
|
||||
tamed = false,
|
||||
pause_timer = 0,
|
||||
horny = false,
|
||||
|
@ -3365,8 +3378,8 @@ minetest.register_entity(name, {
|
|||
runaway_timer = 0,
|
||||
pathfinding = def.pathfinding,
|
||||
immune_to = def.immune_to or {},
|
||||
explosion_radius = def.explosion_radius,
|
||||
explosion_damage_radius = def.explosion_damage_radius,
|
||||
explosion_radius = def.explosion_radius, -- LEGACY
|
||||
explosion_damage_radius = def.explosion_damage_radius, -- LEGACY
|
||||
explosion_timer = def.explosion_timer or 3,
|
||||
allow_fuse_reset = def.allow_fuse_reset ~= false,
|
||||
stop_to_explode = def.stop_to_explode ~= false,
|
||||
|
@ -3393,6 +3406,8 @@ minetest.register_entity(name, {
|
|||
texture_mods = {},
|
||||
shoot_arrow = def.shoot_arrow,
|
||||
sounds_child = def.sounds_child,
|
||||
explosion_strength = def.explosion_strength,
|
||||
suffocation_timer = 0,
|
||||
-- End of MCL2 extensions
|
||||
|
||||
on_spawn = def.on_spawn,
|
||||
|
@ -3837,8 +3852,7 @@ end
|
|||
|
||||
|
||||
-- no damage to nodes explosion
|
||||
function mobs:safe_boom(self, pos, radius)
|
||||
|
||||
function mobs:safe_boom(self, pos, strength)
|
||||
minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", {
|
||||
pos = pos,
|
||||
gain = 1.0,
|
||||
|
@ -3851,19 +3865,14 @@ end
|
|||
|
||||
|
||||
-- make explosion with protection and tnt mod check
|
||||
function mobs:boom(self, pos, radius)
|
||||
function mobs:boom(self, pos, strength, fire)
|
||||
|
||||
if mobs_griefing
|
||||
and mod_tnt and tnt and tnt.boom
|
||||
and not minetest.is_protected(pos, "") then
|
||||
|
||||
tnt.boom(pos, {
|
||||
radius = radius,
|
||||
damage_radius = radius,
|
||||
sound = self.sounds and self.sounds.explode,
|
||||
explode_center = true,
|
||||
is_tnt = false,
|
||||
})
|
||||
if mod_explosions then
|
||||
if mobs_griefing and not minetest.is_protected(pos, "") then
|
||||
mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object)
|
||||
else
|
||||
mobs:safe_boom(self, pos, strength)
|
||||
end
|
||||
else
|
||||
mobs:safe_boom(self, pos, radius)
|
||||
end
|
||||
|
|
11
mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr
Normal file
|
@ -0,0 +1,11 @@
|
|||
# textdomain: mcl_mobs
|
||||
Peaceful mode active! No monsters will spawn.=Mode paisible actif! Aucun monstre n'apparaîtra.
|
||||
This allows you to place a single mob.=Cela vous permet de placer un seul mob.
|
||||
Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Placez-le là où vous voulez que le mob apparaisse. Les animaux apparaîtront apprivoisés, sauf si vous maintenez la touche furtive enfoncée pendant le placement. Si vous le placez sur un générateur de mob, vous changez le mob qu'il génère.
|
||||
You need the “maphack” privilege to change the mob spawner.=Vous avez besoin du privilège "maphack" pour changer le générateur de mob.
|
||||
Name Tag=Étiquette de nom
|
||||
A name tag is an item to name a mob.=Une étiquette de nom est un élément pour nommer un mob.
|
||||
Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Avant d'utiliser l'étiquette de nom, vous devez définir un nom sur une enclume. Ensuite, vous pouvez utiliser l'étiquette de nom pour nommer un mob. Cela utilise l'étiquette de nom.
|
||||
Only peaceful mobs allowed!=Seuls les mobs pacifiques sont autorisées!
|
||||
Give names to mobs=Donne des noms aux mobs
|
||||
Set name at anvil=Définir le nom sur l'enclume
|
|
@ -1,2 +1,2 @@
|
|||
name = mcl_mobs
|
||||
optional_depends = mcl_weather, mcl_tnt, mcl_hunger, mcl_worlds, invisibility, lucky_block, cmi, doc_identifier, mcl_armor
|
||||
optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, invisibility, lucky_block, cmi, doc_identifier, mcl_armor
|
||||
|
|
Before Width: | Height: | Size: 895 B After Width: | Height: | Size: 178 B |
276
mods/ENTITIES/mcl_paintings/init.lua
Normal file
|
@ -0,0 +1,276 @@
|
|||
mcl_paintings = {}
|
||||
|
||||
dofile(minetest.get_modpath(minetest.get_current_modname()).."/paintings.lua")
|
||||
|
||||
local S = minetest.get_translator("mcl_paintings")
|
||||
|
||||
local wood = "[combine:16x16:-192,0=mcl_paintings_paintings.png"
|
||||
|
||||
-- Check if there's a painting for provided painting size.
|
||||
-- If yes, returns the arguments.
|
||||
-- If not, returns the next smaller available painting.
|
||||
local shrink_painting = function(x, y)
|
||||
if x > 4 or y > 4 then
|
||||
return nil
|
||||
end
|
||||
local xstart = x
|
||||
local painting
|
||||
while not painting do
|
||||
painting = mcl_paintings.paintings[y] and mcl_paintings.paintings[y][x]
|
||||
if type(painting) == "table" then
|
||||
break
|
||||
elseif type(painting) == "number" then
|
||||
x = painting
|
||||
painting = nil
|
||||
else
|
||||
x = xstart
|
||||
y = y - 1
|
||||
end
|
||||
if y < 1 then
|
||||
return nil
|
||||
end
|
||||
end
|
||||
if type(painting) == "table" then
|
||||
return x, y
|
||||
end
|
||||
end
|
||||
|
||||
local get_painting = function(x, y, motive)
|
||||
local painting = mcl_paintings.paintings[y] and mcl_paintings.paintings[y][x] and mcl_paintings.paintings[y][x][motive]
|
||||
if not painting then
|
||||
return nil
|
||||
end
|
||||
local px, py = -painting.cx, -painting.cy
|
||||
local sx, sy = 16*x, 16*y
|
||||
return "[combine:"..sx.."x"..sy..":"..px..","..py.."=mcl_paintings_paintings.png"
|
||||
end
|
||||
|
||||
local get_random_painting = function(x, y)
|
||||
if not mcl_paintings.paintings[y] or not mcl_paintings.paintings[y][x] then
|
||||
return nil
|
||||
end
|
||||
local max = #mcl_paintings.paintings[y][x]
|
||||
if max < 1 then
|
||||
return nil
|
||||
end
|
||||
local r = math.random(1, max)
|
||||
return get_painting(x, y, r), r
|
||||
end
|
||||
|
||||
local size_to_minmax = function(size)
|
||||
local min, max
|
||||
if size == 2 then
|
||||
min = -0.5
|
||||
max = 1.5
|
||||
elseif size == 3 then
|
||||
min = -1.5
|
||||
max = 1.5
|
||||
elseif size == 4 then
|
||||
min = -1.5
|
||||
max = 2.5
|
||||
else
|
||||
min = -0.5
|
||||
max = 0.5
|
||||
end
|
||||
return min, max
|
||||
end
|
||||
|
||||
local size_to_minmax_entity = function(size)
|
||||
return -size/2, size/2
|
||||
end
|
||||
|
||||
local set_entity = function(object)
|
||||
local ent = object:get_luaentity()
|
||||
local wallm = ent._facing
|
||||
local xsize = ent._xsize
|
||||
local ysize = ent._ysize
|
||||
local exmin, exmax = size_to_minmax_entity(xsize)
|
||||
local eymin, eymax = size_to_minmax_entity(ysize)
|
||||
local visual_size = { x=xsize-0.0001, y=ysize-0.0001, z=1/32 }
|
||||
if not ent._xsize or not ent._ysize or not ent._motive then
|
||||
minetest.log("error", "[mcl_paintings] Painting loaded with missing painting values!")
|
||||
return
|
||||
end
|
||||
local painting = get_painting(xsize, ysize, ent._motive)
|
||||
if not painting then
|
||||
minetest.log("error", "[mcl_paintings] No painting found for size "
|
||||
..xsize..","..ysize..", motive number "..ent._motive.."!")
|
||||
return
|
||||
end
|
||||
if wallm == 4 or wallm == 5 then
|
||||
object:set_properties({
|
||||
selectionbox = { exmin, eymin, -1/64, exmax, eymax, 1/64 },
|
||||
visual_size = visual_size,
|
||||
textures = { wood, wood, wood, wood, painting, wood },
|
||||
})
|
||||
else
|
||||
object:set_properties({
|
||||
selectionbox = { -1/64, eymin, exmin, 1/64, eymax, exmax },
|
||||
visual_size = visual_size,
|
||||
textures = { wood, wood, wood, wood, painting, wood },
|
||||
})
|
||||
end
|
||||
local dir = minetest.wallmounted_to_dir(wallm)
|
||||
if not dir then
|
||||
return
|
||||
end
|
||||
object:set_yaw(minetest.dir_to_yaw(dir))
|
||||
end
|
||||
|
||||
minetest.register_entity("mcl_paintings:painting", {
|
||||
visual = "cube",
|
||||
visual_size = { x=0.999, y=0.999, z=1/32 },
|
||||
selectionbox = { -1/64, -0.5, -0.5, 1/64, 0.5, 0.5 },
|
||||
physical = false,
|
||||
collide_with_objects = false,
|
||||
textures = { wood, wood, wood, wood, wood, wood },
|
||||
hp_max = 1,
|
||||
|
||||
_motive = 0,
|
||||
_pos = nil,
|
||||
_facing = 2,
|
||||
_xsize = 1,
|
||||
_ysize = 1,
|
||||
on_activate = function(self, staticdata)
|
||||
if staticdata and staticdata ~= "" then
|
||||
local data = minetest.deserialize(staticdata)
|
||||
if data then
|
||||
self._facing = data._facing
|
||||
self._pos = data._pos
|
||||
self._motive = data._motive
|
||||
self._xsize = data._xsize
|
||||
self._ysize = data._ysize
|
||||
end
|
||||
end
|
||||
set_entity(self.object)
|
||||
end,
|
||||
get_staticdata = function(self)
|
||||
local data = {
|
||||
_facing = self._facing,
|
||||
_pos = self._pos,
|
||||
_motive = self._motive,
|
||||
_xsize = self._xsize,
|
||||
_ysize = self._ysize,
|
||||
}
|
||||
return minetest.serialize(data)
|
||||
end,
|
||||
on_death = function(self, killer)
|
||||
-- Drop as item on death
|
||||
if not minetest.settings:get_bool("creative_mode") then
|
||||
local pos = self._pos
|
||||
if not pos then
|
||||
pos = self.object:get_pos()
|
||||
end
|
||||
minetest.add_item(pos, "mcl_paintings:painting")
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_craftitem("mcl_paintings:painting", {
|
||||
description = S("Painting"),
|
||||
inventory_image = "mcl_paintings_painting.png",
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
if pointed_thing.type ~= "node" then
|
||||
return itemstack
|
||||
end
|
||||
local dir = vector.subtract(pointed_thing.above, pointed_thing.under)
|
||||
dir = vector.normalize(dir)
|
||||
if dir.y ~= 0 then
|
||||
-- Ceiling/floor paintings are not supported
|
||||
return itemstack
|
||||
end
|
||||
local wallm = minetest.dir_to_wallmounted(dir)
|
||||
if wallm then
|
||||
local ppos = pointed_thing.above
|
||||
local xmax
|
||||
local ymax = 4
|
||||
local xmaxes = {}
|
||||
local ymaxed = false
|
||||
local negative = dir.x < 0 or dir.z > 0
|
||||
-- Check maximum possible painting size
|
||||
local t
|
||||
for y=0,3 do
|
||||
for x=0,3 do
|
||||
local k = x
|
||||
if negative then
|
||||
k = -k
|
||||
end
|
||||
if dir.z ~= 0 then
|
||||
t = {x=k,y=y,z=0}
|
||||
else
|
||||
t = {x=0,y=y,z=k}
|
||||
end
|
||||
local unode = minetest.get_node(vector.add(pointed_thing.under, t))
|
||||
local anode = minetest.get_node(vector.add(ppos, t))
|
||||
local udef = minetest.registered_nodes[unode.name]
|
||||
local adef = minetest.registered_nodes[anode.name]
|
||||
if (not (udef and udef.walkable)) or (not adef or adef.walkable) then
|
||||
xmaxes[y+1] = x
|
||||
if x == 0 and not ymaxed then
|
||||
ymax = y
|
||||
ymaxed = true
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
if not xmaxes[y] then
|
||||
xmaxes[y] = 4
|
||||
end
|
||||
end
|
||||
xmax = math.max(unpack(xmaxes))
|
||||
|
||||
local xsize, ysize = xmax, ymax
|
||||
xsize, ysize = shrink_painting(xsize, ysize)
|
||||
if not xsize then
|
||||
return itemstack
|
||||
end
|
||||
local _, exmax = size_to_minmax_entity(xsize)
|
||||
local _, eymax = size_to_minmax_entity(ysize)
|
||||
local pposa = vector.subtract(ppos, vector.multiply(dir, 0.5-2/64))
|
||||
local pexmax
|
||||
local peymax = eymax - 0.5
|
||||
if negative then
|
||||
pexmax = -exmax + 0.5
|
||||
else
|
||||
pexmax = exmax - 0.5
|
||||
end
|
||||
if dir.z ~= 0 then
|
||||
pposa = vector.add(pposa, {x=pexmax, y=peymax, z=0})
|
||||
else
|
||||
pposa = vector.add(pposa, {x=0, y=peymax, z=pexmax})
|
||||
end
|
||||
local painting, pid = get_random_painting(xsize, ysize)
|
||||
if not painting then
|
||||
minetest.log("error", "[mcl_paintings] No painting found for size "..xsize..","..ysize.."!")
|
||||
return itemstack
|
||||
end
|
||||
local staticdata = {
|
||||
_facing = wallm,
|
||||
_pos = ppos,
|
||||
_motive = pid,
|
||||
_xsize = xsize,
|
||||
_ysize = ysize,
|
||||
}
|
||||
local obj = minetest.add_entity(pposa, "mcl_paintings:painting", minetest.serialize(staticdata))
|
||||
if not obj then
|
||||
return itemstack
|
||||
end
|
||||
else
|
||||
return itemstack
|
||||
end
|
||||
if not minetest.settings:get_bool("creative_mode") then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_paintings:painting",
|
||||
recipe = {
|
||||
{ "mcl_core:stick", "mcl_core:stick", "mcl_core:stick" },
|
||||
{ "mcl_core:stick", "group:wool", "mcl_core:stick" },
|
||||
{ "mcl_core:stick", "mcl_core:stick", "mcl_core:stick" },
|
||||
}
|
||||
})
|
||||
|
2
mods/ENTITIES/mcl_paintings/locale/mcl_paintings.de.tr
Normal file
|
@ -0,0 +1,2 @@
|
|||
# textdomain:mcl_paintings
|
||||
Painting=Gemälde
|
2
mods/ENTITIES/mcl_paintings/locale/template.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
# textdomain:mcl_paintings
|
||||
Painting=
|
1
mods/ENTITIES/mcl_paintings/mod.conf
Normal file
|
@ -0,0 +1 @@
|
|||
name = mcl_paintings
|
55
mods/ENTITIES/mcl_paintings/paintings.lua
Normal file
|
@ -0,0 +1,55 @@
|
|||
local TS = 16 -- texture size
|
||||
|
||||
mcl_paintings.paintings = {
|
||||
[1] = {
|
||||
[1] = {
|
||||
{ cx = 0, cy = 0 },
|
||||
{ cx = TS, cy = 0 },
|
||||
{ cx = 2*TS, cy = 0 },
|
||||
{ cx = 3*TS, cy = 0 },
|
||||
{ cx = 4*TS, cy = 0 },
|
||||
{ cx = 5*TS, cy = 0 },
|
||||
{ cx = 6*TS, cy = 0 },
|
||||
},
|
||||
[2] = {
|
||||
{ cx = 0, cy = 2*TS },
|
||||
{ cx = 2*TS, cy = 2*TS },
|
||||
{ cx = 4*TS, cy = 2*TS },
|
||||
{ cx = 6*TS, cy = 2*TS },
|
||||
{ cx = 8*TS, cy = 2*TS },
|
||||
},
|
||||
[3] = 2,
|
||||
[4] = 2,
|
||||
},
|
||||
[2] = {
|
||||
[1] = {
|
||||
{ cx = 0, cy = 4*TS },
|
||||
{ cx = TS, cy = 4*TS },
|
||||
},
|
||||
[2] = {
|
||||
{ cx = 0, cy = 8*TS },
|
||||
{ cx = 2*TS, cy = 8*TS },
|
||||
{ cx = 4*TS, cy = 8*TS },
|
||||
{ cx = 6*TS, cy = 8*TS },
|
||||
{ cx = 8*TS, cy = 8*TS },
|
||||
{ cx = 10*TS, cy = 8*TS },
|
||||
},
|
||||
[3] = 2,
|
||||
[4] = {
|
||||
{ cx = 0, cy = 6*TS },
|
||||
},
|
||||
},
|
||||
[3] = {
|
||||
[4] = {
|
||||
{ cx = 12*TS, cy = 4*TS },
|
||||
{ cx = 12*TS, cy = 7*TS },
|
||||
},
|
||||
},
|
||||
[4] = {
|
||||
[4] = {
|
||||
{ cx = 0, cy = 12*TS },
|
||||
{ cx = 4*TS, cy = 12*TS },
|
||||
{ cx = 8*TS, cy = 12*TS },
|
||||
},
|
||||
},
|
||||
}
|
BIN
mods/ENTITIES/mcl_paintings/textures/mcl_paintings_painting.png
Normal file
After Width: | Height: | Size: 229 B |
BIN
mods/ENTITIES/mcl_paintings/textures/mcl_paintings_paintings.png
Normal file
After Width: | Height: | Size: 46 KiB |
|
@ -262,17 +262,6 @@ if c("saddle") then
|
|||
})
|
||||
end
|
||||
|
||||
if c("saddle") and c("lether") and c("string") and c("iron_ingot") then
|
||||
minetest.register_craft({
|
||||
output = "mobs_mc:saddle",
|
||||
recipe = {
|
||||
{"mobs:leather", "mobs:leather", "mobs:leather"},
|
||||
{"farming:string", "", "farming:string"},
|
||||
{"default:steel_ingot", "", "default:steel_ingot"}
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
-- Horse Armor
|
||||
local horse_armor_use = S("Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.")
|
||||
-- TODO: Balance the horse armor strength, compare with MC armor strength
|
||||
|
|
|
@ -36,9 +36,8 @@ mobs:register_mob("mobs_mc:creeper", {
|
|||
runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" },
|
||||
attack_type = "explode",
|
||||
|
||||
explosion_radius = 3,
|
||||
explosion_strength = 3,
|
||||
reach = 4,
|
||||
explosion_damage_radius = 7,
|
||||
explosion_timer = 1.5,
|
||||
allow_fuse_reset = true,
|
||||
stop_to_explode = true,
|
||||
|
@ -70,7 +69,7 @@ mobs:register_mob("mobs_mc:creeper", {
|
|||
if self._forced_explosion_countdown_timer ~= nil then
|
||||
self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime
|
||||
if self._forced_explosion_countdown_timer <= 0 then
|
||||
mobs:boom(self, self.object:get_pos(), self.explosion_radius)
|
||||
mobs:boom(self, self.object:get_pos(), self.explosion_strength)
|
||||
self.object:remove()
|
||||
end
|
||||
end
|
||||
|
|
|
@ -79,13 +79,12 @@ mobs:register_arrow("mobs_mc:fireball", {
|
|||
textures = {"mcl_fire_fire_charge.png"},
|
||||
velocity = 15,
|
||||
|
||||
-- direct hit, no fire... just plenty of pain
|
||||
hit_player = function(self, player)
|
||||
player:punch(self.object, 1.0, {
|
||||
full_punch_interval = 1.0,
|
||||
damage_groups = {fleshy = 6},
|
||||
}, nil)
|
||||
mobs:boom(self, self.object:get_pos(), 3)
|
||||
mobs:boom(self, self.object:get_pos(), 1, true)
|
||||
end,
|
||||
|
||||
hit_mob = function(self, mob)
|
||||
|
@ -93,12 +92,11 @@ mobs:register_arrow("mobs_mc:fireball", {
|
|||
full_punch_interval = 1.0,
|
||||
damage_groups = {fleshy = 6},
|
||||
}, nil)
|
||||
mobs:boom(self, self.object:get_pos(), 3)
|
||||
mobs:boom(self, self.object:get_pos(), 1, true)
|
||||
end,
|
||||
|
||||
-- node hit, explode
|
||||
hit_node = function(self, pos, node)
|
||||
mobs:boom(self, pos, 3)
|
||||
mobs:boom(self, pos, 1, true)
|
||||
end
|
||||
})
|
||||
|
||||
|
|
|
@ -81,7 +81,9 @@ mobs:register_mob("mobs_mc:guardian", {
|
|||
view_range = 16,
|
||||
})
|
||||
|
||||
mobs:spawn_specific("mobs_mc:guardian", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water - 10)
|
||||
-- Spawning disabled due to size issues
|
||||
-- TODO: Re-enable spawning
|
||||
--mobs:spawn_specific("mobs_mc:guardian", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water - 10)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0)
|
||||
|
|
|
@ -88,7 +88,9 @@ mobs:register_mob("mobs_mc:guardian_elder", {
|
|||
view_range = 16,
|
||||
})
|
||||
|
||||
mobs:spawn_specific("mobs_mc:guardian_elder", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-18)
|
||||
-- Spawning disabled due to size issues
|
||||
-- TODO: Re-enable spawning
|
||||
-- mobs:spawn_specific("mobs_mc:guardian_elder", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-18)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0)
|
||||
|
|
|
@ -131,7 +131,6 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
if self.tamed and not self.child and self.owner == clicker:get_player_name() then
|
||||
|
||||
-- Place carpet
|
||||
--[[ TODO: Re-enable this code when carpet textures arrived.
|
||||
if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then
|
||||
for group, carpetdata in pairs(carpets) do
|
||||
if minetest.get_item_group(item:get_name(), group) == 1 then
|
||||
|
@ -161,7 +160,6 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
end
|
||||
end
|
||||
end
|
||||
]]
|
||||
|
||||
-- detatch player already riding llama
|
||||
if self.driver and clicker == self.driver then
|
||||
|
@ -181,8 +179,6 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
end
|
||||
end,
|
||||
|
||||
--[[
|
||||
TODO: Enable this code when carpet textures arrived.
|
||||
on_breed = function(parent1, parent2)
|
||||
-- When breeding, make sure the child has no carpet
|
||||
local pos = parent1.object:get_pos()
|
||||
|
@ -204,7 +200,6 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
return false
|
||||
end
|
||||
end,
|
||||
]]
|
||||
|
||||
})
|
||||
|
||||
|
|
75
mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr
Normal file
|
@ -0,0 +1,75 @@
|
|||
# textdomain: mobs_mc
|
||||
Totem of Undying=Totem d'immortalité
|
||||
A totem of undying is a rare artifact which may safe you from certain death.=Un totem d'immortalité est un artefact rare qui peut vous protéger d'une mort certaine.
|
||||
The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Le totem ne fonctionne que lorsque vous le tenez dans votre main. Si vous recevez des dégâts mortels, vous êtes sauvé de la mort et vous obtenez une seconde chance avec 1 HP. Cependant, le totem est détruit.
|
||||
Agent=Agent
|
||||
Bat=Chauve-souris
|
||||
Blaze=Blaze
|
||||
Chicken=Poulet
|
||||
Cow=Vache
|
||||
Mooshroom=Champimeuh
|
||||
Creeper=Creeper
|
||||
Ender Dragon=Ender Dragon
|
||||
Enderman=Enderman
|
||||
Endermite=Endermite
|
||||
Ghast=Ghast
|
||||
Elder Guardian=Gardien de l'Elder
|
||||
Guardian=Gardien
|
||||
Horse=Cheval
|
||||
Skeleton Horse=Cheval-squelette
|
||||
Zombie Horse=Cheval-zombie
|
||||
Donkey=Âne
|
||||
Mule=Mule
|
||||
Iron Golem=Golem de fer
|
||||
Llama=Lama
|
||||
Ocelot=Ocelot
|
||||
Parrot=Perroquet
|
||||
Pig=Cochon
|
||||
Polar Bear=Ours blanc
|
||||
Rabbit=Lapin
|
||||
Killer Bunny=Lapin tueur
|
||||
Sheep=Mouton
|
||||
Shulker=Shulker
|
||||
Silverfish=Poisson d'argent
|
||||
Skeleton=Squelette
|
||||
Stray=Vagabond
|
||||
Wither Skeleton=Wither squelette
|
||||
Magma Cube=Cube de magma
|
||||
Slime=Slime
|
||||
Snow Golem=Golem de neige
|
||||
Spider=Araignée
|
||||
Cave Spider=Araignée venimeuse
|
||||
Squid=Poulpe
|
||||
Vex=Vex
|
||||
Evoker=Invocateur
|
||||
Illusioner=Illusionniste
|
||||
Villager=Villageois
|
||||
Vindicator=Vindicateur
|
||||
Zombie Villager=Zombie Villageois
|
||||
Witch=Sorcière
|
||||
Wither=Wither
|
||||
Wolf=Loup
|
||||
Husk=Zombie Momifié
|
||||
Zombie=Zombie
|
||||
Zombie Pigman=Zombie Cochon
|
||||
Iron Horse Armor=Armure de cheval en fer
|
||||
Iron horse armor can be worn by horses to increase their protection from harm a bit.=L'armure de cheval en fer peut être portée par les chevaux pour augmenter un peu leur protection contre les dommages.
|
||||
Golden Horse Armor=Armure de cheval en or
|
||||
Golden horse armor can be worn by horses to increase their protection from harm.=Une armure de cheval en or peut être portée par les chevaux pour augmenter leur protection contre les dommages.
|
||||
Diamond Horse Armor=Armure de cheval en diamant
|
||||
Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Une armure de cheval en diament peut être portée par les chevaux pour augmenter fortement leur protection contre les dommages.
|
||||
Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Placez-la sur un cheval pour mettre l'armure de cheval. Les ânes et les mules ne peuvent pas porter d'armure de cheval.
|
||||
Farmer=Fermier
|
||||
Fisherman=Pêcheur
|
||||
Fletcher=Archer
|
||||
Shepherd=Berger
|
||||
Librarian=Bibliothécaire
|
||||
Cartographer=Cartographe
|
||||
Armorer=Armurier
|
||||
Leatherworker=Tanneur
|
||||
Butcher=Boucher
|
||||
Weapon Smith=Fabriquant d'arme
|
||||
Tool Smith=Fabriquant d'outil
|
||||
Cleric=Clerc
|
||||
Nitwit=Crétin
|
||||
Protects you from death while wielding it=Vous protège de la mort en la maniant
|
Before Width: | Height: | Size: 346 B After Width: | Height: | Size: 282 B |
Before Width: | Height: | Size: 176 B After Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 208 B |
Before Width: | Height: | Size: 186 B After Width: | Height: | Size: 185 B |
Before Width: | Height: | Size: 3 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 321 B |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 765 B |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 3 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 7.2 KiB |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_black.png
Normal file
After Width: | Height: | Size: 537 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_blue.png
Normal file
After Width: | Height: | Size: 551 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_brown.png
Normal file
After Width: | Height: | Size: 546 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png
Normal file
After Width: | Height: | Size: 648 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_gray.png
Normal file
After Width: | Height: | Size: 394 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png
Normal file
After Width: | Height: | Size: 491 B |
After Width: | Height: | Size: 549 B |
After Width: | Height: | Size: 736 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png
Normal file
After Width: | Height: | Size: 572 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png
Normal file
After Width: | Height: | Size: 645 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png
Normal file
After Width: | Height: | Size: 672 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png
Normal file
After Width: | Height: | Size: 565 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_purple.png
Normal file
After Width: | Height: | Size: 471 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_red.png
Normal file
After Width: | Height: | Size: 542 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_silver.png
Normal file
After Width: | Height: | Size: 736 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_trader.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png
Normal file
After Width: | Height: | Size: 616 B |
BIN
mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png
Normal file
After Width: | Height: | Size: 798 B |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 642 B |
Before Width: | Height: | Size: 3 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 374 B After Width: | Height: | Size: 350 B |
Before Width: | Height: | Size: 433 B After Width: | Height: | Size: 298 B |
Before Width: | Height: | Size: 573 B After Width: | Height: | Size: 368 B |
Before Width: | Height: | Size: 547 B After Width: | Height: | Size: 365 B |
Before Width: | Height: | Size: 561 B After Width: | Height: | Size: 369 B |
Before Width: | Height: | Size: 558 B After Width: | Height: | Size: 363 B |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 992 B After Width: | Height: | Size: 989 B |
Before Width: | Height: | Size: 315 B After Width: | Height: | Size: 312 B |
Before Width: | Height: | Size: 648 B After Width: | Height: | Size: 476 B |
Before Width: | Height: | Size: 489 B After Width: | Height: | Size: 460 B |
Before Width: | Height: | Size: 439 B After Width: | Height: | Size: 340 B |
Before Width: | Height: | Size: 529 B After Width: | Height: | Size: 375 B |
Before Width: | Height: | Size: 759 B After Width: | Height: | Size: 486 B |