Compare commits
8 Commits
master
...
mobs_actua
Author | SHA1 | Date |
---|---|---|
cora | 09b4cc6f3a | |
cora | 9f971ab1a6 | |
cora | 1986f864e4 | |
cora | 6a2109ad68 | |
cora | 7c696052e0 | |
cora | 338aead015 | |
cora | c92aa062da | |
cora | 3c60903d95 |
123
CONTRIBUTING.md
|
@ -2,7 +2,7 @@
|
|||
So you want to contribute to MineClone2?
|
||||
Wow, thank you! :-)
|
||||
|
||||
MineClone2 is maintained by Nicu and Cora. If you have any
|
||||
MineClone2 is maintained by Nicu and Fleckenstein. If you have any
|
||||
problems or questions, contact us (See Links section below).
|
||||
|
||||
You can help with MineClone2's development in many different ways,
|
||||
|
@ -11,9 +11,18 @@ whether you're a programmer or not.
|
|||
## MineClone2's development target is to...
|
||||
- Crucially, create a stable, moddable, free/libre clone of Minecraft
|
||||
based on the Minetest engine with polished features, usable in both
|
||||
singleplayer and multiplayer. Currently, a lot of Minecraft features
|
||||
are already implemented.
|
||||
Polishing existing features is always welcome.
|
||||
singleplayer and multiplayer. Currently, most of **Minecraft Java
|
||||
Edition 1.12.2** features are already implemented and polishing existing
|
||||
features are prioritized over new feature requests.
|
||||
- With lessened priority yet strictly, implement features targetting
|
||||
**Minecraft version 1.17 + OptiFine** (OptiFine only as far as supported
|
||||
by the Minetest Engine). This means features in parity with the listed
|
||||
Minecraft experiences are prioritized over those that don't fulfill this
|
||||
scope.
|
||||
- Optionally, create a performant experience that will run relatively
|
||||
well on really low spec computers. Unfortunately, due to Minecraft's
|
||||
mechanisms and Minetest engine's limitations along with a very small
|
||||
playerbase on low spec computers, optimizations are hard to investigate.
|
||||
|
||||
## Links
|
||||
* [Mesehub](https://git.minetest.land/MineClone2/MineClone2)
|
||||
|
@ -36,10 +45,8 @@ referenced frequently because of its usefulness. As such, it is valuable
|
|||
in learning how git works and its terminology. It can also help you
|
||||
keeping your game updated, and easily test pull requests.
|
||||
|
||||
Look at our wiki for some concrete guides:
|
||||
https://git.minetest.land/MineClone2/MineClone2/wiki/
|
||||
|
||||
## How you can help as a non-programmer
|
||||
|
||||
As someone who does not know how to write programs in Lua or does not
|
||||
know how to use the Minetest API, you can still help us out a lot. For
|
||||
example, by opening an issue in the
|
||||
|
@ -51,10 +58,12 @@ you can report a bug or request a feature.
|
|||
discussion.
|
||||
* Choose a descriptive title (e.g. not just "crash", "bug" or "question"
|
||||
).
|
||||
* Please write in plain, understandable English. It will be easier to
|
||||
communicate.
|
||||
* Please start the issue title with a capital letter.
|
||||
* Always check the currently opened issues before creating a new one.
|
||||
Try not to report bugs that have already been reported or request features
|
||||
that already have been requested. This can often be ambiguous though.
|
||||
If in doubt open an issue!
|
||||
Don't report bugs that have already been reported or request features
|
||||
that already have been requested.
|
||||
* If you know about Minetest's inner workings, please think about
|
||||
whether the bug / the feature that you are reporting / requesting is
|
||||
actually an issue with Minetest itself, and if it is, head to the
|
||||
|
@ -64,9 +73,6 @@ instead.
|
|||
an issue, feel free to ask on the Discord / Matrix server or the IRC
|
||||
channel.
|
||||
|
||||
The link to the mesehub registration page is: https://git.minetest.land/user/sign_up
|
||||
(It appears to sometimes get lost on the page itsself)
|
||||
|
||||
### Reporting bugs
|
||||
* A bug is an unintended behavior or, in the worst case, a crash.
|
||||
However, it is not a bug if you believe something is missing in the
|
||||
|
@ -105,28 +111,23 @@ would report issues will pull requests similar to when you were
|
|||
reporting bugs that are the mainline (See Reporting bugs section). You
|
||||
can find currently open pull requests here:
|
||||
<https://git.minetest.land/MineClone2/MineClone2/pulls>. Note that pull
|
||||
requests that start with a `WIP:` are not done yet and therefore could
|
||||
still undergo substantial change. Testing these is still helpful however
|
||||
because that is the reason developers put them up as WIP so other people
|
||||
can have a look at the PR.
|
||||
requests that start with a `WIP:` are not done yet, and therefore might
|
||||
not work, so it's not very useful to try them out yet.
|
||||
|
||||
### Contributing assets
|
||||
Due to license problems, MineClone2 cannot use Minecraft's assets,
|
||||
therefore we are always looking for asset contributions.
|
||||
|
||||
To contribute assets, it can be useful to learn git basics and read
|
||||
the section for Programmers of this document, however this is not required.
|
||||
It's also a good idea to join the Discord server
|
||||
Due to license problems, MineClone2 unfortunately cannot use
|
||||
Minecraft's assets, therefore we are always looking for asset
|
||||
contributions. To contribute assets, it can be useful to learn git
|
||||
basics and read the section for Programmers of this document, however
|
||||
this is not required. It's also a good idea to join the Discord server
|
||||
(or alternatively IRC or Matrix).
|
||||
|
||||
#### Textures
|
||||
For textures we use the Pixel Perfection texture pack. For older Minecraft
|
||||
features that is mostly enough but a lot of the newer textures in it are
|
||||
copies or slight modifications of the original MC textures so great caution
|
||||
needs to be taken when using any textures coming from Minecraft texture
|
||||
packs.
|
||||
If you want to make such contributions, join our Discord server. Demands
|
||||
for textures will be communicated there.
|
||||
For textures we use the Pixel Perfection texture pack. This is mostly
|
||||
enough; however in some cases - e.g. for newer Minecraft features, it's
|
||||
useful to have texture artists around. If you want to make such
|
||||
contributions, join our Discord server. Demands for textures will be
|
||||
communicated there.
|
||||
|
||||
#### Sounds
|
||||
MineClone2 currently does not have a consistent way to handle sounds.
|
||||
|
@ -250,25 +251,16 @@ of the results)
|
|||
* [Official Minecraft Wiki](https://minecraft.fandom.com/wiki/Minecraft_Wiki)
|
||||
(Include a link to the specific page you used)
|
||||
|
||||
### Guidelines
|
||||
### Stick to our guidelines
|
||||
|
||||
#### Git Guidelines
|
||||
* Pushing to master is disabled - don't even try it.
|
||||
* Every change is tracked as a PR.
|
||||
* All but the tiniest changes require at least one approval from a Developer
|
||||
* To update branches we use rebase not merge (so we don't end up with
|
||||
excessive git bureaucracy commits in master)
|
||||
* We use merge to add the commits from a PR/branch to master
|
||||
* Submodules should only be used if a) upstream is highly reliable and
|
||||
b) it is 100% certain that no mcl2 specific changes to the code will be
|
||||
needed (this has never been the case before, hence mcl2 is submodule free so far)
|
||||
* Commit messages should be descriptive and never contain mcl2 specific
|
||||
issueids - there are other projects who might use commits from mcl2 and
|
||||
it will confuse their issue trackers.
|
||||
* Try to group your submissions best as you can:
|
||||
* Try to keep your PRs small: In some cases things reasonably be can't
|
||||
split up but in general multiple small PRs are better than a big one.
|
||||
* Similarly multiple small commits are better than a giant one. (use git commit -p)
|
||||
* We use merge rather than rebase or squash merge
|
||||
* We don't use git submodules.
|
||||
* Your commit names should be relatively descriptive, e.g. when saying
|
||||
"Fix #issueid", the commit message should also contain the title of the
|
||||
issue.
|
||||
* Try to keep your commits as atomic as possible (advise, but completely
|
||||
optional)
|
||||
|
||||
#### Code Guidelines
|
||||
* Each mod must provide `mod.conf`.
|
||||
|
@ -351,23 +343,36 @@ Active and trusted contributors are often granted write access to the
|
|||
MineClone2 repository.
|
||||
|
||||
#### Developer responsibilities
|
||||
- If you have developer privileges you can just open a new branch in the
|
||||
mcl2 repository (which is preferred). From that you create a pull request.
|
||||
This way other people can review your changes and make sure they work
|
||||
before they get merged.
|
||||
- If you do not (yet) have developer privs you do your work on a branch
|
||||
on your private repository e.g. using the "fork" function on mesehub.
|
||||
- Any developer is welcome to review, test and merge PRs. A PR needs
|
||||
at least one approval (by someone else than the author) but the maintainers
|
||||
are usually relatively quick to react to new submissions.
|
||||
- You should not push things directly to
|
||||
MineClone2 master - rather, do your work on a branch on your private
|
||||
repository, then create a pull request. This way other people can review
|
||||
your changes and make sure they work before they get merged.
|
||||
- Merge PRs only when they have recieved the necessary feedback and have
|
||||
been tested by at least two different people (including the author of
|
||||
the pull request), to avoid crashes or the introduction of new bugs.
|
||||
- You may also be assigned to issues or pull
|
||||
requests as a developer. In this case it is your responsibility to fix
|
||||
the issue / review and merge the pull request when it is ready. You can
|
||||
also unassign yourself from the issue / PR if you have no time or don't
|
||||
want to take care of it for some other reason. After all, everyone is a
|
||||
volunteer and we can't expect you to do work that you are not interested
|
||||
in. **The important thing is that you make sure to inform us if you
|
||||
won't take care of something that has been assigned to you.**
|
||||
- Please assign yourself to something that you want to work on to avoid
|
||||
duplicate work.
|
||||
- As a developer, it should be easy to reach you about your work. You
|
||||
should be in at least one of the public MineClone2 discussion rooms -
|
||||
preferrably Discord, but if you really don't like Discord, Matrix
|
||||
or IRC are fine too.
|
||||
|
||||
### Maintainer status
|
||||
Maintainers carry the main responsibility for the project.
|
||||
|
||||
#### Maintainer responsibilities
|
||||
- Making sure issues are addressed and pull requests are reviewed and
|
||||
merged.
|
||||
merged, by assigning either themselves or Developers to issues / PRs
|
||||
- Making releases
|
||||
- Making sure guidelines are kept
|
||||
- Making project decisions based on community feedback
|
||||
- Granting/revoking developer access
|
||||
- Enforcing the code of conduct (See CODE_OF_CONDUCT.md)
|
||||
|
@ -375,8 +380,8 @@ merged.
|
|||
- Resolving conflicts and problems within the community
|
||||
|
||||
#### Current maintainers
|
||||
* Cora - responsible for gameplay review, publishing releases,
|
||||
technical guidelines
|
||||
* Fleckenstein - responsible for gameplay review, publishing releases,
|
||||
technical guidelines and issue/PR delegation
|
||||
* Nicu - responsible for community related issues
|
||||
|
||||
#### Release process
|
||||
|
|
10
CREDITS.md
|
@ -29,10 +29,9 @@
|
|||
* kabou
|
||||
* rudzik8
|
||||
* chmodsayshello
|
||||
* PrairieWind
|
||||
* PrarieWind
|
||||
* RandomLegoBrick
|
||||
* SumianVoice
|
||||
* MrRar
|
||||
|
||||
## Contributors
|
||||
* Laurent Rocher
|
||||
|
@ -83,8 +82,6 @@
|
|||
* mrminer
|
||||
* Thunder1035
|
||||
* opfromthestart
|
||||
* snowyu
|
||||
* FaceDeer
|
||||
|
||||
## MineClone5
|
||||
* kay27
|
||||
|
@ -94,7 +91,7 @@
|
|||
* j45
|
||||
* chmodsayshello
|
||||
* 3raven
|
||||
* PrairieWind
|
||||
* PrarieWind
|
||||
* Gustavo1
|
||||
* CableGuy67
|
||||
* MrRar
|
||||
|
@ -135,7 +132,6 @@
|
|||
* 4Evergreen4
|
||||
* jordan4ibanez
|
||||
* paramat
|
||||
* cora
|
||||
|
||||
## 3D Models
|
||||
* 22i
|
||||
|
@ -165,8 +161,6 @@
|
|||
* Marcin Serwin
|
||||
* Pepebotella
|
||||
* Emojigit
|
||||
* snowyu
|
||||
* 3raven
|
||||
|
||||
## Funders
|
||||
* 40W
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils.
|
||||
Developed by many people. Not developed or endorsed by Mojang AB.
|
||||
|
||||
Version: 0.80 (in development)
|
||||
Version: 0.79 (in development)
|
||||
|
||||
### Gameplay
|
||||
You start in a randomly-generated world made entirely of cubes. You can explore
|
||||
|
|
|
@ -33,8 +33,6 @@ mcl_damage = {
|
|||
}
|
||||
}
|
||||
|
||||
local damage_enabled = minetest.settings:get_bool("enabled_damage",true)
|
||||
|
||||
function mcl_damage.register_modifier(func, priority)
|
||||
table.insert(mcl_damage.modifiers, {func = func, priority = priority or 0})
|
||||
end
|
||||
|
@ -141,7 +139,6 @@ function mcl_damage.register_type(name, def)
|
|||
end
|
||||
|
||||
minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
|
||||
if not damage_enabled then return 0 end
|
||||
if hp_change < 0 then
|
||||
if player:get_hp() <= 0 then
|
||||
return 0
|
||||
|
@ -152,7 +149,6 @@ minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
|
|||
end, true)
|
||||
|
||||
minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
|
||||
if not damage_enabled then return 0 end
|
||||
if player:get_hp() > 0 then
|
||||
mt_reason.approved = true
|
||||
if hp_change < 0 then
|
||||
|
|
|
@ -162,8 +162,7 @@ end
|
|||
mcl_vars.mg_end_min = -27073 -- Carefully chosen to be at a mapchunk border
|
||||
mcl_vars.mg_end_max_official = mcl_vars.mg_end_min + minecraft_height_limit
|
||||
mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000
|
||||
mcl_vars.mg_end_platform_pos = { x = 100, y = mcl_vars.mg_end_min + 64, z = 0 }
|
||||
mcl_vars.mg_end_exit_portal_pos = vector.new(0, mcl_vars.mg_end_min + 71, 0)
|
||||
mcl_vars.mg_end_platform_pos = { x = 100, y = mcl_vars.mg_end_min + 74, z = 0 }
|
||||
|
||||
-- Realm barrier used to safely separate the End from the void below the Overworld
|
||||
mcl_vars.mg_realm_barrier_overworld_end_max = mcl_vars.mg_end_max
|
||||
|
|
Before Width: | Height: | Size: 144 B |
|
@ -610,95 +610,3 @@ function mcl_util.get_pointed_thing(player, liquid)
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- This following part is 2 wrapper functions + helpers for
|
||||
-- object:set_bones
|
||||
-- and player:set_properties preventing them from being resent on
|
||||
-- every globalstep when they have not changed.
|
||||
|
||||
local function roundN(n, d)
|
||||
if type(n) ~= "number" then return n end
|
||||
local m = 10^d
|
||||
return math.floor(n * m + 0.5) / m
|
||||
end
|
||||
|
||||
local function close_enough(a,b)
|
||||
local rt=true
|
||||
if type(a) == "table" and type(b) == "table" then
|
||||
for k,v in pairs(a) do
|
||||
if roundN(v,2) ~= roundN(b[k],2) then
|
||||
rt=false
|
||||
break
|
||||
end
|
||||
end
|
||||
else
|
||||
rt = roundN(a,2) == roundN(b,2)
|
||||
end
|
||||
return rt
|
||||
end
|
||||
|
||||
local function props_changed(props,oldprops)
|
||||
local changed=false
|
||||
local p={}
|
||||
for k,v in pairs(props) do
|
||||
if not close_enough(v,oldprops[k]) then
|
||||
p[k]=v
|
||||
changed=true
|
||||
end
|
||||
end
|
||||
return changed,p
|
||||
end
|
||||
|
||||
--tests for roundN
|
||||
local test_round1=15
|
||||
local test_round2=15.00199999999
|
||||
local test_round3=15.00111111
|
||||
local test_round4=15.00999999
|
||||
|
||||
assert(roundN(test_round1,2)==roundN(test_round1,2))
|
||||
assert(roundN(test_round1,2)==roundN(test_round2,2))
|
||||
assert(roundN(test_round1,2)==roundN(test_round3,2))
|
||||
assert(roundN(test_round1,2)~=roundN(test_round4,2))
|
||||
|
||||
-- tests for close_enough
|
||||
local test_cb = {-0.35,0,-0.35,0.35,0.8,0.35} --collisionboxes
|
||||
local test_cb_close = {-0.351213,0,-0.35,0.35,0.8,0.351212}
|
||||
local test_cb_diff = {-0.35,0,-1.35,0.35,0.8,0.35}
|
||||
|
||||
local test_eh = 1.65 --eye height
|
||||
local test_eh_close = 1.65123123
|
||||
local test_eh_diff = 1.35
|
||||
|
||||
local test_nt = { r = 225, b = 225, a = 225, g = 225 } --nametag
|
||||
local test_nt_diff = { r = 225, b = 225, a = 0, g = 225 }
|
||||
|
||||
assert(close_enough(test_cb,test_cb_close))
|
||||
assert(not close_enough(test_cb,test_cb_diff))
|
||||
assert(close_enough(test_eh,test_eh_close))
|
||||
assert(not close_enough(test_eh,test_eh_diff))
|
||||
assert(not close_enough(test_nt,test_nt_diff)) --no floats involved here
|
||||
|
||||
--tests for properties_changed
|
||||
local test_properties_set1={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.65, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}
|
||||
local test_properties_set2={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}
|
||||
|
||||
local test_p1,_=props_changed(test_properties_set1,test_properties_set1)
|
||||
local test_p2,_=props_changed(test_properties_set1,test_properties_set2)
|
||||
|
||||
assert(not test_p1)
|
||||
assert(test_p2)
|
||||
|
||||
function mcl_util.set_properties(obj,props)
|
||||
local changed,p=props_changed(props,obj:get_properties())
|
||||
if changed then
|
||||
obj:set_properties(p)
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_util.set_bone_position(obj,b,p,r) --bone,position,rotation
|
||||
local oldp,oldr=obj:get_bone_position(b)
|
||||
if vector.equals(vector.round(oldp),vector.round(p)) and vector.equals(vector.round(oldr),vector.round(r)) then
|
||||
return
|
||||
end
|
||||
obj:set_bone_position(b,p,r)
|
||||
end
|
||||
|
|
|
@ -413,21 +413,13 @@ end
|
|||
-- Register one entity for all boat types
|
||||
minetest.register_entity("mcl_boats:boat", boat)
|
||||
|
||||
local cboat = table.copy(boat)
|
||||
cboat.mesh = "mcl_boats_boat_with_chest.b3d"
|
||||
cboat.textures = {"mcl_boats_texture_oak_chest_boat.png", "mcl_boats_texture_oak_chest_boat.png", "mcl_boats_texture_oak_chest_boat.png", "mcl_boats_texture_oak_chest_boat.png", "mcl_boats_texture_oak_chest_boat.png"}
|
||||
cboat._itemstring = "mcl_boats:chest_boat"
|
||||
|
||||
minetest.register_entity("mcl_boats:chest_boat", cboat)
|
||||
mcl_entity_invs.register_inv("mcl_boats:chest_boat","Boat",27)
|
||||
|
||||
local boat_ids = { "boat", "boat_spruce", "boat_birch", "boat_jungle", "boat_acacia", "boat_dark_oak", "boat_obsidian", "boat_mangrove", "chest_boat", "chest_boat_spruce", "chest_boat_birch", "chest_boat_jungle", "chest_boat_acacia", "chest_boat_dark_oak", "chest_boat_mangrove" }
|
||||
local names = { S("Oak Boat"), S("Spruce Boat"), S("Birch Boat"), S("Jungle Boat"), S("Acacia Boat"), S("Dark Oak Boat"), S("Obsidian Boat"), S("Mangrove Boat"), S("Oak Chest Boat"), S("Spruce Chest Boat"), S("Birch Chest Boat"), S("Jungle Chest Boat"), S("Acacia Chest Boat"), S("Dark Oak Chest Boat"), S("Mangrove Chest Boat") }
|
||||
local boat_ids = { "boat", "boat_spruce", "boat_birch", "boat_jungle", "boat_acacia", "boat_dark_oak", "boat_obsidian" }
|
||||
local names = { S("Oak Boat"), S("Spruce Boat"), S("Birch Boat"), S("Jungle Boat"), S("Acacia Boat"), S("Dark Oak Boat"), S("Obsidian Boat") }
|
||||
local craftstuffs = {}
|
||||
if minetest.get_modpath("mcl_core") then
|
||||
craftstuffs = { "mcl_core:wood", "mcl_core:sprucewood", "mcl_core:birchwood", "mcl_core:junglewood", "mcl_core:acaciawood", "mcl_core:darkwood", "mcl_core:obsidian", "mcl_mangrove:mangrove_wood" }
|
||||
craftstuffs = { "mcl_core:wood", "mcl_core:sprucewood", "mcl_core:birchwood", "mcl_core:junglewood", "mcl_core:acaciawood", "mcl_core:darkwood", "mcl_core:obsidian" }
|
||||
end
|
||||
local images = { "oak", "spruce", "birch", "jungle", "acacia", "dark_oak", "obsidian", "mangrove", "oak_chest", "spruce_chest", "birch_chest", "jungle_chest", "acacia_chest", "dark_oak_chest", "mangrove_chest" }
|
||||
local images = { "oak", "spruce", "birch", "jungle", "acacia", "dark_oak", "obsidian" }
|
||||
|
||||
for b=1, #boat_ids do
|
||||
local itemstring = "mcl_boats:"..boat_ids[b]
|
||||
|
@ -477,11 +469,7 @@ for b=1, #boat_ids do
|
|||
else
|
||||
pos = vector.add(pos, vector.multiply(dir, boat_y_offset_ground))
|
||||
end
|
||||
local boat_ent = "mcl_boats:boat"
|
||||
if itemstring:find("chest") then
|
||||
boat_ent = "mcl_boats:chest_boat"
|
||||
end
|
||||
local boat = minetest.add_entity(pos, boat_ent)
|
||||
local boat = minetest.add_entity(pos, "mcl_boats:boat")
|
||||
local texture = "mcl_boats_texture_"..images[b].."_boat.png"
|
||||
boat:get_luaentity()._itemstring = itemstring
|
||||
boat:set_properties({textures = { texture, texture, texture, texture, texture }})
|
||||
|
@ -504,22 +492,13 @@ for b=1, #boat_ids do
|
|||
})
|
||||
|
||||
local c = craftstuffs[b]
|
||||
if not itemstring:find("chest") then
|
||||
minetest.register_craft({
|
||||
output = itemstring:gsub(":boat",":chest_boat"),
|
||||
recipe = {
|
||||
{"mcl_chests:chest"},
|
||||
{itemstring},
|
||||
},
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = itemstring,
|
||||
recipe = {
|
||||
{c, "", c},
|
||||
{c, c, c},
|
||||
},
|
||||
})
|
||||
end
|
||||
minetest.register_craft({
|
||||
output = itemstring,
|
||||
recipe = {
|
||||
{c, "", c},
|
||||
{c, c, c},
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
name = mcl_boats
|
||||
author = PilzAdam
|
||||
description = Adds drivable boats.
|
||||
depends = mcl_player, flowlib, mcl_title, mcl_entity_invs
|
||||
depends = mcl_player, flowlib, mcl_title
|
||||
optional_depends = mcl_core, doc_identifier
|
||||
|
||||
|
||||
|
|
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB |
|
@ -1,5 +1,3 @@
|
|||
local enable_damage = minetest.settings:get_bool("enable_damage")
|
||||
|
||||
function mcl_burning.get_storage(obj)
|
||||
return obj:is_player() and mcl_burning.storage[obj] or obj:get_luaentity()
|
||||
end
|
||||
|
@ -79,7 +77,7 @@ end
|
|||
-- The effective burn duration is modified by obj's armor protection.
|
||||
-- If obj was already burning, its burn duration is updated if the current
|
||||
-- duration is less than burn_time.
|
||||
-- If obj is dead, fireproof or enable_damage is disabled, this function does nothing.
|
||||
-- If obj is dead, fireproof or a creative player, this function does nothing.
|
||||
--
|
||||
function mcl_burning.set_on_fire(obj, burn_time)
|
||||
if obj:get_hp() < 0 then
|
||||
|
@ -91,9 +89,8 @@ function mcl_burning.set_on_fire(obj, burn_time)
|
|||
return
|
||||
end
|
||||
|
||||
if obj:is_player() and not enable_damage then
|
||||
if obj:is_player() and minetest.is_creative_enabled(obj:get_player_name()) then
|
||||
burn_time = 0
|
||||
return
|
||||
else
|
||||
local max_fire_prot_lvl = 0
|
||||
local inv = mcl_util.get_inventory(obj)
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
mcl_entity_invs
|
||||
===============
|
||||
|
||||
Inventories for your entities. It's simple. Depend on mcl_entity_invs and register your entity like so:
|
||||
|
||||
* mcl_entity_invs.register_inv("entity:name","Title shown in formspec",inventory_size,disable_on_righclick)
|
||||
*If disable_on_righclick is true other mods can handle when to show the inventory themselves
|
||||
* The inventory size can be set dynamically by initializing it with an explicit nil
|
||||
|
||||
* mcl_entity_invs.show_inv_form(entity,clicker,[formspec text])
|
||||
* formspec_text is an additional text that is put after the title
|
||||
|
||||
It works by setting up a detached inventory per entity which is accessed by an id/hash generated from the entities position at creation, the progressed gametime at creation and a random salt.
|
|
@ -1,170 +0,0 @@
|
|||
mcl_entity_invs = {}
|
||||
|
||||
local open_invs = {}
|
||||
|
||||
local function check_distance(inv,player,count)
|
||||
for _,o in pairs(minetest.get_objects_inside_radius(player:get_pos(),5)) do
|
||||
local l = o:get_luaentity()
|
||||
if l and l._inv_id and inv:get_location().name == l._inv_id then return count end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
local inv_callbacks = {
|
||||
allow_take = function(inv, listname, index, stack, player)
|
||||
return check_distance(inv,player,stack:get_count())
|
||||
end,
|
||||
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
|
||||
return check_distance(inv,player,count)
|
||||
end,
|
||||
allow_put = function(inv, listname, index, stack, player)
|
||||
return check_distance(inv,player,stack:get_count())
|
||||
end,
|
||||
}
|
||||
|
||||
local function load_inv(ent,size)
|
||||
if not ent._inv_id then return end
|
||||
local inv = minetest.get_inventory({type="detached", name=ent._inv_id})
|
||||
if not inv then
|
||||
inv = minetest.create_detached_inventory(ent._inv_id, inv_callbacks)
|
||||
inv:set_size("main", size)
|
||||
if ent._items then
|
||||
inv:set_list("main",ent._items)
|
||||
end
|
||||
end
|
||||
return inv
|
||||
end
|
||||
|
||||
local function save_inv(ent)
|
||||
if ent._inv then
|
||||
ent._items = {}
|
||||
for i,it in ipairs(ent._inv:get_list("main")) do
|
||||
ent._items[i] = it:to_string()
|
||||
end
|
||||
minetest.remove_detached_inventory(ent._inv_id)
|
||||
ent._inv = nil
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_entity_invs.show_inv_form(ent,player,text)
|
||||
if not ent._inv_id then return end
|
||||
if not open_invs[ent] then
|
||||
open_invs[ent] = 0
|
||||
end
|
||||
text = text or ""
|
||||
ent._inv = load_inv(ent,ent._inv_size)
|
||||
open_invs[ent] = open_invs[ent] + 1
|
||||
local playername = player:get_player_name()
|
||||
local rows = 3
|
||||
local cols = (math.ceil(ent._inv_size/rows))
|
||||
local spacing = (9 - cols) / 2
|
||||
local formspec = "size[9,8.75]"
|
||||
.. "label[0,0;" .. minetest.formspec_escape(
|
||||
minetest.colorize("#313131", ent._inv_title .. " ".. text)) .. "]"
|
||||
.. "list[detached:"..ent._inv_id..";main;"..spacing..",0.5;"..cols..","..rows..";]"
|
||||
.. mcl_formspec.get_itemslot_bg(spacing,0.5,cols,rows)
|
||||
.. "label[0,4.0;" .. minetest.formspec_escape(
|
||||
minetest.colorize("#313131", "Inventory")) .. "]"
|
||||
.. "list[current_player;main;0,4.5;9,3;9]"
|
||||
.. mcl_formspec.get_itemslot_bg(0,4.5,9,3)
|
||||
.. "list[current_player;main;0,7.74;9,1;]"
|
||||
.. mcl_formspec.get_itemslot_bg(0,7.74,9,1)
|
||||
.. "listring[detached:"..ent._inv_id..";main]"
|
||||
.. "listring[current_player;main]"
|
||||
minetest.show_formspec(playername,ent._inv_id,formspec)
|
||||
end
|
||||
|
||||
local function drop_inv(ent)
|
||||
if not ent._items then return end
|
||||
local pos = ent.object:get_pos()
|
||||
for i,it in pairs(ent._items) do
|
||||
local p = vector.add(pos,vector.new(math.random() - 0.5, math.random()-0.5, math.random()-0.5))
|
||||
minetest.add_item(p,it)
|
||||
end
|
||||
ent._items = nil
|
||||
end
|
||||
|
||||
local function on_remove(self,killer,oldf)
|
||||
save_inv(self)
|
||||
drop_inv(self)
|
||||
if oldf then return oldf(self,killer) end
|
||||
end
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
for k,v in pairs(open_invs) do
|
||||
if formname == k._inv_id then
|
||||
open_invs[k] = open_invs[k] - 1
|
||||
if open_invs[k] < 1 then
|
||||
save_inv(k)
|
||||
open_invs[k] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
function mcl_entity_invs.register_inv(entity_name,show_name,size,no_on_righclick)
|
||||
assert(minetest.registered_entities[entity_name],"mcl_entity_invs.register_inv called with invalid entity: "..tostring(entity_name))
|
||||
minetest.registered_entities[entity_name]._inv_size = size
|
||||
minetest.registered_entities[entity_name]._inv_title = show_name
|
||||
|
||||
local old_oa = minetest.registered_entities[entity_name].on_activate
|
||||
minetest.registered_entities[entity_name].on_activate = function(self,staticdata,dtime_s)
|
||||
local r
|
||||
if old_oa then r=old_oa(self,staticdata,dtime_s) end
|
||||
local d = minetest.deserialize(staticdata)
|
||||
if type(d) == "table" and d._inv_id then
|
||||
self._inv_id = d._inv_id
|
||||
self._items = d._items
|
||||
self._inv_size = d._inv_size
|
||||
else
|
||||
self._inv_id="entity_inv_"..minetest.sha1(minetest.get_gametime()..minetest.pos_to_string(self.object:get_pos())..tostring(math.random()))
|
||||
--gametime and position for collision safety and math.random salt to protect against position brute-force
|
||||
end
|
||||
return r
|
||||
end
|
||||
if not no_on_righclick then
|
||||
local old_rc = minetest.registered_entities[entity_name].on_rightclick
|
||||
minetest.registered_entities[entity_name].on_rightclick = function(self,clicker)
|
||||
mcl_entity_invs.show_inv_form(self,clicker,show_name)
|
||||
if old_rc then return old_rc(self,clicker) end
|
||||
end
|
||||
end
|
||||
|
||||
local old_gsd = minetest.registered_entities[entity_name].get_staticdata
|
||||
minetest.registered_entities[entity_name].get_staticdata = function(self)
|
||||
local old_sd = old_gsd(self)
|
||||
local d = minetest.deserialize(old_sd)
|
||||
assert(type(d) == "table","mcl_entity_invs currently only works with entities that return a (serialized) table in get_staticdata. "..tostring(self.name).." returned: "..tostring(old_sd))
|
||||
d._inv_id = self._inv_id
|
||||
d._inv_size = self._inv_size
|
||||
d._items = {}
|
||||
if self._items then
|
||||
for i,it in ipairs(self._items) do
|
||||
d._items[i] = it
|
||||
end
|
||||
end
|
||||
return minetest.serialize(d)
|
||||
end
|
||||
|
||||
local old_ode = minetest.registered_entities[entity_name].on_deactivate
|
||||
minetest.registered_entities[entity_name].on_deactivate = function(self,removal)
|
||||
save_inv(self)
|
||||
if removal then
|
||||
on_remove(self)
|
||||
end
|
||||
if old_ode then return old_ode(self,removal) end
|
||||
end
|
||||
|
||||
local old_od = minetest.registered_entities[entity_name].on_death
|
||||
minetest.registered_entities[entity_name].on_death = function(self,killer)
|
||||
if not self.is_mob then
|
||||
on_remove(self,killer,old_od)
|
||||
end
|
||||
end
|
||||
local old_odi = minetest.registered_entities[entity_name].on_die
|
||||
minetest.registered_entities[entity_name].on_die = function(self,killer)
|
||||
if self.is_mob then
|
||||
on_remove(self,killer,old_od)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,3 +0,0 @@
|
|||
name = mcl_entity_invs
|
||||
author = cora
|
||||
depends = mcl_formspec
|
|
@ -61,8 +61,6 @@ mcl_item_entity.register_pickup_achievement("mcl_mobitems:leather", "mcl:killCow
|
|||
mcl_item_entity.register_pickup_achievement("mcl_core:diamond", "mcl:diamonds")
|
||||
mcl_item_entity.register_pickup_achievement("mcl_core:crying_obsidian", "mcl:whosCuttingOnions")
|
||||
mcl_item_entity.register_pickup_achievement("mcl_nether:ancient_debris", "mcl:hiddenInTheDepths")
|
||||
mcl_item_entity.register_pickup_achievement("mcl_end:dragon_egg", "mcl:PickUpDragonEgg")
|
||||
mcl_item_entity.register_pickup_achievement("mcl_armor:elytra", "mcl:skysTheLimit")
|
||||
|
||||
local function check_pickup_achievements(object, player)
|
||||
if has_awards then
|
||||
|
|
|
@ -677,8 +677,7 @@ register_minecart(
|
|||
{ "mcl_chests_normal.png", "mcl_minecarts_minecart.png" },
|
||||
"mcl_minecarts_minecart_chest.png",
|
||||
{"mcl_minecarts:minecart", "mcl_chests:chest"},
|
||||
nil, nil, true)
|
||||
mcl_entity_invs.register_inv("mcl_minecarts:chest_minecart","Minecart",27)
|
||||
nil, nil, false)
|
||||
|
||||
-- Minecart with Furnace
|
||||
register_minecart(
|
||||
|
@ -731,7 +730,7 @@ register_minecart(
|
|||
"mcl_minecarts_minecart.png",
|
||||
}})
|
||||
end
|
||||
end, nil, true
|
||||
end, nil, false
|
||||
)
|
||||
|
||||
-- Minecart with Command Block
|
||||
|
@ -831,7 +830,8 @@ minetest.register_craft({
|
|||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
-- TODO: Re-enable crafting of special minecarts when they have been implemented
|
||||
--[[minetest.register_craft({
|
||||
output = "mcl_minecarts:furnace_minecart",
|
||||
recipe = {
|
||||
{"mcl_furnaces:furnace"},
|
||||
|
@ -839,16 +839,13 @@ minetest.register_craft({
|
|||
},
|
||||
})
|
||||
|
||||
-- TODO: Re-enable crafting of special minecarts when they have been implemented
|
||||
|
||||
--[[minetest.register_craft({
|
||||
minetest.register_craft({
|
||||
output = "mcl_minecarts:hopper_minecart",
|
||||
recipe = {
|
||||
{"mcl_hoppers:hopper"},
|
||||
{"mcl_minecarts:minecart"},
|
||||
},
|
||||
})
|
||||
--]]
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_minecarts:chest_minecart",
|
||||
|
@ -856,7 +853,7 @@ minetest.register_craft({
|
|||
{"mcl_chests:chest"},
|
||||
{"mcl_minecarts:minecart"},
|
||||
},
|
||||
})
|
||||
})]]
|
||||
|
||||
|
||||
if has_mcl_wip then
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
name = mcl_minecarts
|
||||
author = Krock
|
||||
description = Minecarts are vehicles to move players quickly on rails.
|
||||
depends = mcl_title, mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons, mcl_entity_invs
|
||||
depends = mcl_title, mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons
|
||||
optional_depends = doc_identifier, mcl_wip
|
||||
|
||||
|
|
|
@ -259,7 +259,6 @@ functions needed for the mob to work properly which contains the following:
|
|||
that are bred in a different way.
|
||||
'pick_up' table of itemstrings the mob will pick up (e.g. for breeding)
|
||||
'on_pick_up' function that will be called on item pickup - return true to not pickup the item
|
||||
'custom_visual_size' will not reset visual_size from the base class on reload
|
||||
|
||||
mobs:gopath(self,target,callback_arrived) pathfind a way to target and run callback on arrival
|
||||
|
||||
|
@ -434,7 +433,7 @@ true the mob will not spawn.
|
|||
MineClone 2 extensions
|
||||
----------------------
|
||||
|
||||
mcl_mobs:spawn_child(pos, mob_type)
|
||||
mobs:spawn_child(pos, mob_type)
|
||||
|
||||
This function spawns a mob as a child. The parameter mob_type is the
|
||||
entitystring of the new mob.
|
||||
|
@ -444,7 +443,6 @@ mobs:death_effect(pos, collisionbox)
|
|||
|
||||
Create death particles at pos with the given collisionbox.
|
||||
|
||||
mcl_mobs.spawn(pos,name/entity name)
|
||||
|
||||
Making Arrows
|
||||
-------------
|
||||
|
@ -486,13 +484,13 @@ This function registers a arrow for mobs with the attack type shoot.
|
|||
Spawn Eggs
|
||||
----------
|
||||
|
||||
mobs:register_egg(name, description, background_color, overlay_color, addegg, no_creative)
|
||||
mobs:register_egg(name, description, background, addegg, no_creative)
|
||||
|
||||
This function registers a spawn egg which can be used by admin to properly spawn in a mob.
|
||||
|
||||
'name' this is the name of your new mob to spawn e.g. "mob:sheep"
|
||||
'description' the name of the new egg you are creating e.g. "Spawn Sheep"
|
||||
'background_color' and 'overlay_color' define the colors for the texture displayed for the egg in inventory
|
||||
'background'the texture displayed for the egg in inventory
|
||||
'addegg' would you like an egg image in front of your texture (1 = yes,
|
||||
0 = no)
|
||||
'no_creative' when set to true this stops spawn egg appearing in creative
|
||||
|
|
|
@ -29,17 +29,16 @@ local dbg_spawn_succ = 0
|
|||
local aoc_range = 136
|
||||
|
||||
local mob_cap = {
|
||||
monster = minetest.settings:get_bool("mcl_mob_cap_monster") or 70,
|
||||
animal = minetest.settings:get_bool("mcl_mob_cap_animal") or 10,
|
||||
ambient = minetest.settings:get_bool("mcl_mob_cap_ambient") or 15,
|
||||
water = minetest.settings:get_bool("mcl_mob_cap_water") or 5, --currently unused
|
||||
water_ambient = minetest.settings:get_bool("mcl_mob_cap_water_ambient") or 20, --currently unused
|
||||
monster = 70,
|
||||
animal =10,
|
||||
ambient =15,
|
||||
water = 5, --currently unused
|
||||
water_ambient = 20, --currently unused
|
||||
}
|
||||
|
||||
--do mobs spawn?
|
||||
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
|
||||
local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false
|
||||
local logging = minetest.settings:get_bool("mcl_logging_mobs_spawn",true)
|
||||
|
||||
|
||||
local noise_params = {
|
||||
offset = 0,
|
||||
|
@ -339,7 +338,7 @@ function mcl_mobs:spawn_setup(def)
|
|||
summary_chance = summary_chance + chance
|
||||
end
|
||||
|
||||
function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
|
||||
function mcl_mobs.register_spawn(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
|
||||
|
||||
-- Do mobs spawn at all?
|
||||
if not mobs_spawn then
|
||||
|
@ -378,6 +377,15 @@ function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_
|
|||
spawn_dictionary[key]["day_toggle"] = day_toggle
|
||||
|
||||
summary_chance = summary_chance + chance
|
||||
|
||||
end
|
||||
|
||||
function mcl_mobs:spawn_specific(...)
|
||||
return mcl_mobs.register_spawn(...)
|
||||
end
|
||||
|
||||
function mobs:spawn_specific(...)
|
||||
return mcl_mobs.register_spawn(...)
|
||||
end
|
||||
|
||||
local two_pi = 2 * math.pi
|
||||
|
@ -437,6 +445,7 @@ local function spawn_check(pos,spawn_def)
|
|||
pos.y = pos.y + 1
|
||||
local has_room = #minetest.find_nodes_in_area(pos,vector.offset(pos,0,1,0),{"air"}) or 0 >= 2
|
||||
local is_water = get_item_group(gotten_node, "water") ~= 0
|
||||
local is_water_above = get_item_group(minetest.get_node(pos).name, "water") ~= 0
|
||||
local is_lava = get_item_group(gotten_node, "lava") ~= 0
|
||||
local is_leaf = get_item_group(gotten_node, "leaves") ~= 0
|
||||
local is_bedrock = gotten_node == "mcl_core:bedrock"
|
||||
|
@ -452,12 +461,12 @@ local function spawn_check(pos,spawn_def)
|
|||
and spawn_def.dimension == dimension
|
||||
and biome_check(spawn_def.biomes, gotten_biome)
|
||||
and (is_ground or spawn_def.type_of_spawning ~= "ground")
|
||||
and (spawn_def.type_of_spawning ~= "ground" or ( is_ground and not is_water_above))
|
||||
and (spawn_def.type_of_spawning ~= "ground" or not is_leaf)
|
||||
and (spawn_def.type_of_spawning ~= "ground" or has_room)
|
||||
and (spawn_def.check_position and spawn_def.check_position(pos) or true)
|
||||
and (not is_farm_animal(spawn_def.name) or is_grass)
|
||||
and (spawn_def.type_of_spawning ~= "water" or is_water)
|
||||
and ( not spawn_protected or not minetest.is_protected(pos, "") )
|
||||
and not is_bedrock then
|
||||
--only need to poll for node light if everything else worked
|
||||
local gotten_light = get_node_light(pos)
|
||||
|
@ -468,15 +477,6 @@ local function spawn_check(pos,spawn_def)
|
|||
return false
|
||||
end
|
||||
|
||||
function mcl_mobs.spawn(pos,id)
|
||||
local def = minetest.registered_entities[id] or minetest.registered_entities["mobs_mc:"..id] or minetest.registered_entities["extra_mobs:"..id]
|
||||
if not def or (def.can_spawn and not def.can_spawn(pos)) or not def.is_mob then
|
||||
return false
|
||||
end
|
||||
return minetest.add_entity(pos, def.name)
|
||||
end
|
||||
|
||||
|
||||
local function spawn_group(p,mob,spawn_on,group_max,group_min)
|
||||
if not group_min then group_min = 1 end
|
||||
local nn= minetest.find_nodes_in_area_under_air(vector.offset(p,-5,-3,-5),vector.offset(p,5,3,5),spawn_on)
|
||||
|
@ -492,27 +492,13 @@ local function spawn_group(p,mob,spawn_on,group_max,group_min)
|
|||
if mob.type_of_spawning == "water" then
|
||||
sp = get_water_spawn(sp)
|
||||
end
|
||||
o = mcl_mobs.spawn(sp,mob.name)
|
||||
o = minetest.add_entity(sp,mob.name)
|
||||
if o then dbg_spawn_succ = dbg_spawn_succ + 1 end
|
||||
end
|
||||
end
|
||||
return o
|
||||
end
|
||||
|
||||
mcl_mobs.spawn_group = spawn_group
|
||||
|
||||
minetest.register_chatcommand("spawn_mob",{
|
||||
privs = { debug = true },
|
||||
func = function(n,param)
|
||||
local pos = minetest.get_player_by_name(n):get_pos()
|
||||
if mcl_mobs.spawn(pos,param) then
|
||||
return true, param.." spawned at "..minetest.pos_to_string(pos),
|
||||
minetest.log("action", n.." spawned "..param.." at "..minetest.pos_to_string(pos))
|
||||
end
|
||||
return false, "Couldn't spawn "..param
|
||||
end
|
||||
})
|
||||
|
||||
if mobs_spawn then
|
||||
|
||||
local perlin_noise
|
||||
|
@ -563,16 +549,11 @@ if mobs_spawn then
|
|||
--everything is correct, spawn mob
|
||||
local object
|
||||
if spawn_in_group and ( mob_type ~= "monster" or math.random(5) == 1 ) then
|
||||
if logging then
|
||||
minetest.log("action", "[mcl_mobs] A group of mob " .. mob_def.name .. " spawns at " .. minetest.pos_to_string(spawning_position, 1))
|
||||
end
|
||||
object = spawn_group(spawning_position,mob_def,{minetest.get_node(vector.offset(spawning_position,0,-1,0)).name},spawn_in_group,spawn_in_group_min)
|
||||
|
||||
minetest.log("action", "A group of mob " .. mob_def.name .. " spawns at " .. minetest.pos_to_string(spawning_position, 1))
|
||||
else
|
||||
if logging then
|
||||
minetest.log("action", "[mcl_mobs] Mob " .. mob_def.name .. " spawns at " .. minetest.pos_to_string(spawning_position, 1))
|
||||
end
|
||||
object = mcl_mobs.spawn(spawning_position, mob_def.name)
|
||||
object = minetest.add_entity(spawning_position, mob_def.name)
|
||||
minetest.log("action", "Mob " .. mob_def.name .. " spawns at " .. minetest.pos_to_string(spawning_position, 1))
|
||||
end
|
||||
|
||||
|
||||
|
|
|
@ -144,4 +144,4 @@ mobs_mc.water_level-1)
|
|||
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:bat", S("Bat"), "#4c3e30", "#0f0f0f", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:bat", S("Bat"), "mobs_mc_spawn_icon_bat.png", 0)
|
||||
|
|
|
@ -26,12 +26,6 @@ mcl_mobs:register_mob("mobs_mc:blaze", {
|
|||
rotate = -180,
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_blaze.b3d",
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 4,
|
||||
head_eye_height = 3.5,
|
||||
curiosity = 10,
|
||||
head_yaw_offset = 180,
|
||||
head_pitch_multiplier=-1,
|
||||
textures = {
|
||||
{"mobs_mc_blaze.png"},
|
||||
},
|
||||
|
@ -208,4 +202,4 @@ mcl_mobs:register_arrow("mobs_mc:blaze_fireball", {
|
|||
})
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:blaze", S("Blaze"), "#f6b201", "#fff87e", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:blaze", S("Blaze"), "mobs_mc_spawn_icon_blaze.png", 0)
|
||||
|
|
|
@ -20,21 +20,16 @@ mcl_mobs:register_mob("mobs_mc:chicken", {
|
|||
collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.69, 0.2},
|
||||
runaway = true,
|
||||
floats = 1,
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 4,
|
||||
head_eye_height = 1.5,
|
||||
horrizonatal_head_height = -.3,
|
||||
curiosity = 10,
|
||||
head_yaw="z",
|
||||
visual_size = {x=1,y=1},
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_chicken.b3d",
|
||||
textures = {
|
||||
{"mobs_mc_chicken.png"},
|
||||
},
|
||||
visual_size = {x=2.2, y=2.2},
|
||||
|
||||
makes_footstep_sound = true,
|
||||
walk_velocity = 1,
|
||||
stay_near = { nodes = { "group:grass_block" } },
|
||||
drops = {
|
||||
{name = "mcl_mobitems:chicken",
|
||||
chance = 1,
|
||||
|
@ -64,15 +59,12 @@ mcl_mobs:register_mob("mobs_mc:chicken", {
|
|||
distance = 16,
|
||||
},
|
||||
animation = {
|
||||
stand_start = 0, stand_end = 0,
|
||||
walk_start = 0, walk_end = 20, walk_speed = 25,
|
||||
run_start = 0, run_end = 20, run_speed = 50,
|
||||
},
|
||||
child_animations = {
|
||||
stand_start = 31, stand_end = 31,
|
||||
walk_start = 31, walk_end = 51, walk_speed = 37,
|
||||
run_start = 31, run_end = 51, run_speed = 75,
|
||||
stand_speed = 25, walk_speed = 25, run_speed = 50,
|
||||
stand_start = 0, stand_end = 0,
|
||||
walk_start = 0, walk_end = 40,
|
||||
run_start = 0, run_end = 40,
|
||||
},
|
||||
|
||||
follow = {
|
||||
"mcl_farming:wheat_seeds",
|
||||
"mcl_farming:melon_seeds",
|
||||
|
@ -163,4 +155,4 @@ mobs_mc.water_level,
|
|||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:chicken", S("Chicken"), "#a1a1a1", "#ff0000", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:chicken", S("Chicken"), "mobs_mc_spawn_icon_chicken.png", 0)
|
||||
|
|
|
@ -73,6 +73,7 @@ local cod = {
|
|||
makes_footstep_sound = false,
|
||||
fly = true,
|
||||
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
|
||||
stay_near = { nodes = { "group:water" } },
|
||||
breathes_in_water = true,
|
||||
jump = false,
|
||||
view_range = 16,
|
||||
|
@ -271,4 +272,4 @@ water-16,
|
|||
water+1)
|
||||
|
||||
--spawn egg
|
||||
mcl_mobs:register_egg("mobs_mc:cod", S("Cod"), "#c1a76a", "#e5c48b", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:cod", S("Cod"), "extra_mobs_spawn_icon_cod.png", 0)
|
||||
|
|
|
@ -17,14 +17,10 @@ local cow_def = {
|
|||
"mobs_mc_cow.png",
|
||||
"blank.png",
|
||||
}, },
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 10,
|
||||
head_eye_height = 1.1,
|
||||
horrizonatal_head_height=-1.8,
|
||||
curiosity = 2,
|
||||
head_yaw="z",
|
||||
visual_size = {x=2.8, y=2.8},
|
||||
makes_footstep_sound = true,
|
||||
walk_velocity = 1,
|
||||
stay_near = { nodes = { "group:grass_block" } },
|
||||
drops = {
|
||||
{name = "mcl_mobitems:beef",
|
||||
chance = 1,
|
||||
|
@ -46,14 +42,11 @@ local cow_def = {
|
|||
distance = 16,
|
||||
},
|
||||
animation = {
|
||||
stand_start = 0, stand_end = 0,
|
||||
walk_start = 0, walk_end = 40, walk_speed = 30,
|
||||
run_start = 0, run_end = 40, run_speed = 40,
|
||||
},
|
||||
child_animations = {
|
||||
stand_start = 41, stand_end = 41,
|
||||
walk_start = 41, walk_end = 81, walk_speed = 45,
|
||||
run_start = 41, run_end = 81, run_speed = 60,
|
||||
stand_speed = 25, walk_speed = 40,
|
||||
run_speed = 60, stand_start = 0,
|
||||
stand_end = 0, walk_start = 0,
|
||||
walk_end = 40, run_start = 0,
|
||||
run_end = 40,
|
||||
},
|
||||
on_rightclick = function(self, clicker)
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end
|
||||
|
@ -90,8 +83,10 @@ mcl_mobs:register_mob("mobs_mc:cow", cow_def)
|
|||
-- Mooshroom
|
||||
local mooshroom_def = table.copy(cow_def)
|
||||
mooshroom_def.description = S("Mooshroom")
|
||||
mooshroom_def.mesh = "mobs_mc_cow.b3d"
|
||||
mooshroom_def.spawn_in_group_min = 4
|
||||
mooshroom_def.spawn_in_group = 8
|
||||
mooshroom_def.stay_near = { nodes = { "mcl_core:mycelium" } }
|
||||
mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } }
|
||||
mooshroom_def.on_rightclick = function(self, clicker)
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end
|
||||
|
@ -218,5 +213,5 @@ mcl_vars.mg_overworld_min,
|
|||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn egg
|
||||
mcl_mobs:register_egg("mobs_mc:cow", S("Cow"), "#443626", "#a1a1a1", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:mooshroom", S("Mooshroom"), "#a00f10", "#b7b7b7", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:cow", S("Cow"), "mobs_mc_spawn_icon_cow.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:mooshroom", S("Mooshroom"), "mobs_mc_spawn_icon_mooshroom.png", 0)
|
||||
|
|
|
@ -21,9 +21,6 @@ mcl_mobs:register_mob("mobs_mc:creeper", {
|
|||
pathfinding = 1,
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_creeper.b3d",
|
||||
head_swivel = "Head_Control",
|
||||
bone_eye_height = 2.35,
|
||||
curiosity = 2,
|
||||
textures = {
|
||||
{"mobs_mc_creeper.png",
|
||||
"mobs_mc_empty.png"},
|
||||
|
@ -407,4 +404,4 @@ mcl_vars.mg_overworld_min,
|
|||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:creeper", S("Creeper"), "#0da70a", "#000000", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:creeper", S("Creeper"), "mobs_mc_spawn_icon_creeper.png", 0)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
mcl_mobs
|
|
@ -71,6 +71,7 @@ local dolphin = {
|
|||
makes_footstep_sound = false,
|
||||
fly = true,
|
||||
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
|
||||
stay_near = { nodes = { "group:water" } },
|
||||
breathes_in_water = true,
|
||||
jump = false,
|
||||
view_range = 16,
|
||||
|
@ -250,4 +251,4 @@ water-16,
|
|||
water+1)
|
||||
|
||||
--spawn egg
|
||||
mcl_mobs:register_egg("mobs_mc:dolphin", S("Dolphin"), "#223b4d", "#f9f9f9", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:dolphin", S("Dolphin"), "extra_mobs_spawn_icon_dolphin.png", 0)
|
||||
|
|
|
@ -4,50 +4,6 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
local BEAM_CHECK_FREQUENCY = 2
|
||||
local POS_CHECK_FREQUENCY = 15
|
||||
local HEAL_AMMOUNT = 37
|
||||
|
||||
local function heal(self)
|
||||
local o = self.object
|
||||
self.health = math.min(self.hp_max,self.health + HEAL_AMMOUNT)
|
||||
end
|
||||
local function check_beam(self)
|
||||
for _, obj in ipairs(minetest.get_objects_inside_radius(self.object:get_pos(), 80)) do
|
||||
local luaentity = obj:get_luaentity()
|
||||
if luaentity and luaentity.name == "mcl_end:crystal" then
|
||||
if luaentity.beam then
|
||||
if luaentity.beam == self.beam then
|
||||
heal(self)
|
||||
break
|
||||
end
|
||||
else
|
||||
if self.beam then
|
||||
self.beam:remove()
|
||||
end
|
||||
minetest.add_entity(self.object:get_pos(), "mcl_end:crystal_beam"):get_luaentity():init(self.object, obj)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function check_pos(self)
|
||||
if self._portal_pos then
|
||||
-- migrate old format
|
||||
if type(self._portal_pos) == "string" then
|
||||
self._portal_pos = minetest.string_to_pos(self._portal_pos)
|
||||
end
|
||||
local portal_center = vector.add(self._portal_pos, vector.new(0, 11, 0))
|
||||
local pos = self.object:get_pos()
|
||||
if vector.distance(pos, portal_center) > 50 then
|
||||
self.object:set_pos(self._last_good_pos or portal_center)
|
||||
else
|
||||
self._last_good_pos = pos
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
mcl_mobs:register_mob("mobs_mc:enderdragon", {
|
||||
description = S("Ender Dragon"),
|
||||
type = "monster",
|
||||
|
@ -67,7 +23,7 @@ mcl_mobs:register_mob("mobs_mc:enderdragon", {
|
|||
{"mobs_mc_dragon.png"},
|
||||
},
|
||||
visual_size = {x=3, y=3},
|
||||
view_range = 64,
|
||||
view_range = 35,
|
||||
walk_velocity = 6,
|
||||
run_velocity = 6,
|
||||
can_despawn = false,
|
||||
|
@ -105,33 +61,45 @@ mcl_mobs:register_mob("mobs_mc:enderdragon", {
|
|||
run_start = 0, run_end = 20,
|
||||
},
|
||||
ignores_nametag = true,
|
||||
do_custom = function(self,dtime)
|
||||
do_custom = function(self)
|
||||
mcl_bossbars.update_boss(self.object, "Ender Dragon", "light_purple")
|
||||
if self._pos_timer == nil or self._pos_timer > POS_CHECK_FREQUENCY then
|
||||
self._pos_timer = 0
|
||||
check_pos(self)
|
||||
end
|
||||
if self._beam_timer == nil or self._beam_timer > BEAM_CHECK_FREQUENCY then
|
||||
self._beam_timer = 0
|
||||
check_beam(self)
|
||||
end
|
||||
self._beam_timer = self._beam_timer + dtime
|
||||
self._pos_timer = self._pos_timer + dtime
|
||||
end,
|
||||
on_die = function(self, pos, cmi_cause)
|
||||
if self._portal_pos then
|
||||
mcl_portals.spawn_gateway_portal()
|
||||
mcl_structures.place_structure(self._portal_pos,mcl_structures.registered_structures["end_exit_portal_open"],PseudoRandom(minetest.get_mapgen_setting("seed")),-1)
|
||||
if self._initial then
|
||||
mcl_experience.throw_xp(pos, 11500) -- 500 + 11500 = 12000
|
||||
minetest.set_node(vector.add(self._portal_pos, vector.new(0, 5, 0)), {name = "mcl_end:dragon_egg"})
|
||||
for _, obj in ipairs(minetest.get_objects_inside_radius(self.object:get_pos(), 80)) do
|
||||
local luaentity = obj:get_luaentity()
|
||||
if luaentity and luaentity.name == "mcl_end:crystal" then
|
||||
if luaentity.beam then
|
||||
if luaentity.beam == self.beam then
|
||||
break
|
||||
end
|
||||
else
|
||||
if self.beam then
|
||||
self.beam:remove()
|
||||
end
|
||||
minetest.add_entity(self.object:get_pos(), "mcl_end:crystal_beam"):get_luaentity():init(self.object, obj)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Free The End Advancement
|
||||
for _,players in pairs(minetest.get_objects_inside_radius(pos,64)) do
|
||||
if players:is_player() then
|
||||
awards.unlock(players:get_player_name(), "mcl:freeTheEnd")
|
||||
if self._portal_pos then
|
||||
-- migrate old format
|
||||
if type(self._portal_pos) == "string" then
|
||||
self._portal_pos = minetest.string_to_pos(self._portal_pos)
|
||||
end
|
||||
local portal_center = vector.add(self._portal_pos, vector.new(3, 11, 3))
|
||||
local pos = self.object:get_pos()
|
||||
if vector.distance(pos, portal_center) > 50 then
|
||||
self.object:set_pos(self._last_good_pos or portal_center)
|
||||
else
|
||||
self._last_good_pos = pos
|
||||
end
|
||||
end
|
||||
end,
|
||||
on_die = function(self, pos)
|
||||
if self._portal_pos then
|
||||
mcl_portals.spawn_gateway_portal()
|
||||
mcl_structures.call_struct(self._portal_pos, "end_exit_portal_open")
|
||||
if self._initial then
|
||||
mcl_experience.throw_xp(pos, 11500) -- 500 + 11500 = 12000
|
||||
minetest.set_node(vector.add(self._portal_pos, vector.new(3, 5, 3)), {name = "mcl_end:dragon_egg"})
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
@ -170,7 +138,6 @@ mcl_mobs:register_arrow("mobs_mc:dragon_fireball", {
|
|||
end
|
||||
})
|
||||
|
||||
mcl_mobs:register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "#252525", "#b313c9", 0, true)
|
||||
|
||||
mcl_mobs:register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "mobs_mc_spawn_icon_dragon.png", 0, true)
|
||||
|
||||
mcl_wip.register_wip_item("mobs_mc:enderdragon")
|
||||
|
|
|
@ -24,25 +24,7 @@
|
|||
-- added rain damage.
|
||||
-- fixed the grass_with_dirt issue.
|
||||
|
||||
minetest.register_entity("mobs_mc:ender_eyes", {
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_spider.b3d",
|
||||
visual_size = {x=1.01, y=1.01},
|
||||
textures = {
|
||||
"mobs_mc_enderman_eyes.png",
|
||||
},
|
||||
on_step = function(self)
|
||||
if self and self.object then
|
||||
if not self.object:get_attach() then
|
||||
self.object:remove()
|
||||
end
|
||||
end
|
||||
end,
|
||||
glow = 50,
|
||||
})
|
||||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
local enable_damage = minetest.settings:get_bool("enable_damage")
|
||||
|
||||
local telesound = function(pos, is_source)
|
||||
local snd
|
||||
|
@ -255,19 +237,6 @@ mcl_mobs:register_mob("mobs_mc:enderman", {
|
|||
textures = create_enderman_textures(),
|
||||
visual_size = {x=3, y=3},
|
||||
makes_footstep_sound = true,
|
||||
on_spawn = function(self)
|
||||
local spider_eyes=false
|
||||
for n = 1, #self.object:get_children() do
|
||||
local obj = self.object:get_children()[n]
|
||||
if obj:get_luaentity() and self.object:get_luaentity().name == "mobs_mc:ender_eyes" then
|
||||
spider_eyes = true
|
||||
end
|
||||
end
|
||||
if not spider_eyes then
|
||||
minetest.add_entity(self.object:get_pos(), "mobs_mc:ender_eyes"):set_attach(self.object, "head.top", vector.new(0,2.54,-1.99), vector.new(90,0,180))
|
||||
minetest.add_entity(self.object:get_pos(), "mobs_mc:ender_eyes"):set_attach(self.object, "head.top", vector.new(1,2.54,-1.99), vector.new(90,0,180))
|
||||
end
|
||||
end,
|
||||
sounds = {
|
||||
-- TODO: Custom war cry sound
|
||||
war_cry = "mobs_sandmonster",
|
||||
|
@ -413,7 +382,7 @@ mcl_mobs:register_mob("mobs_mc:enderman", {
|
|||
-- self:teleport(nil)
|
||||
-- self.state = ""
|
||||
--else
|
||||
if self.attack ~= nil and enable_damage then
|
||||
if self.attack ~= nil and not minetest.settings:get_bool("creative_mode") then
|
||||
self.state = 'attack'
|
||||
end
|
||||
--end
|
||||
|
@ -663,12 +632,7 @@ mcl_mobs:spawn_specific(
|
|||
"end",
|
||||
"ground",
|
||||
{
|
||||
"End",
|
||||
"EndIsland",
|
||||
"EndMidlands",
|
||||
"EndBarrens",
|
||||
"EndBorder",
|
||||
"EndSmallIslands"
|
||||
"End"
|
||||
},
|
||||
0,
|
||||
minetest.LIGHT_MAX+1,
|
||||
|
@ -833,7 +797,7 @@ mcl_mobs:spawn_specific(
|
|||
"ground",
|
||||
{
|
||||
"Nether",
|
||||
"SoulsandValley",
|
||||
"SoulsandVall3ey",
|
||||
},
|
||||
0,
|
||||
11,
|
||||
|
@ -860,4 +824,4 @@ mcl_vars.mg_nether_min,
|
|||
mcl_vars.mg_nether_max)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:enderman", S("Enderman"), "#252525", "#151515", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:enderman", S("Enderman"), "mobs_mc_spawn_icon_enderman.png", 0)
|
||||
|
|
|
@ -38,4 +38,4 @@ mcl_mobs:register_mob("mobs_mc:endermite", {
|
|||
reach = 1,
|
||||
})
|
||||
|
||||
mcl_mobs:register_egg("mobs_mc:endermite", S("Endermite"), "#161616", "#6d6d6d", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:endermite", S("Endermite"), "mobs_mc_spawn_icon_endermite.png", 0)
|
||||
|
|
|
@ -141,4 +141,4 @@ mcl_mobs:register_arrow("mobs_mc:fireball", {
|
|||
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:ghast", S("Ghast"), "#f9f9f9", "#bcbcbc", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:ghast", S("Ghast"), "mobs_mc_spawn_icon_ghast.png", 0)
|
||||
|
|
|
@ -95,6 +95,7 @@ mcl_mobs:register_mob("mobs_mc:guardian", {
|
|||
fly = true,
|
||||
makes_footstep_sound = false,
|
||||
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
|
||||
stay_near = { nodes = { "group:water" } },
|
||||
jump = false,
|
||||
view_range = 16,
|
||||
})
|
||||
|
@ -104,4 +105,4 @@ mcl_mobs:register_mob("mobs_mc:guardian", {
|
|||
--mcl_mobs:spawn_specific("mobs_mc:guardian", { "mcl_core:water_source", "mclx_core:river_water_source" }, { "mcl_core:water_source", "mclx_core:river_water_source" }, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level - 10)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:guardian", S("Guardian"), "#5a8272", "#f17d31", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0)
|
||||
|
|
|
@ -103,6 +103,7 @@ mcl_mobs:register_mob("mobs_mc:guardian_elder", {
|
|||
fly = true,
|
||||
makes_footstep_sound = false,
|
||||
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
|
||||
stay_near = { nodes = { "group:water" } },
|
||||
jump = false,
|
||||
view_range = 16,
|
||||
})
|
||||
|
@ -112,6 +113,4 @@ mcl_mobs:register_mob("mobs_mc:guardian_elder", {
|
|||
-- mcl_mobs:spawn_specific("mobs_mc:guardian_elder", { "mcl_core:water_source", "mclx_core:river_water_source" }, { "mcl_core:water_source", "mclx_core:river_water_source" }, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level-18)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "#ceccba", "#747693", 0)
|
||||
|
||||
|
||||
mcl_mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0)
|
||||
|
|
|
@ -34,30 +34,6 @@ local horse_extra_texture = function(horse)
|
|||
return textures
|
||||
end
|
||||
|
||||
|
||||
local function get_drops(self)
|
||||
self.drops = {}
|
||||
table.insert(self.drops,
|
||||
{name = "mcl_mobitems:leather",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
looting = "common",
|
||||
})
|
||||
if self._saddle then
|
||||
table.insert(self.drops,{name = "mcl_mobitems:saddle",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,})
|
||||
end
|
||||
if self._chest then
|
||||
table.insert(self.drops,{name = "mcl_chests:chest",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,})
|
||||
end
|
||||
end
|
||||
|
||||
-- Helper functions to determine equipment rules
|
||||
local can_equip_horse_armor = function(entity_id)
|
||||
return entity_id == "mobs_mc:horse" or entity_id == "mobs_mc:skeleton_horse" or entity_id == "mobs_mc:zombie_horse"
|
||||
|
@ -171,6 +147,7 @@ local horse = {
|
|||
makes_footstep_sound = true,
|
||||
jump = true,
|
||||
jump_height = 5.75, -- can clear 2.5 blocks
|
||||
stay_near = { nodes = { "group:grass_block" } },
|
||||
drops = {
|
||||
{name = "mcl_mobitems:leather",
|
||||
chance = 1,
|
||||
|
@ -261,27 +238,6 @@ local horse = {
|
|||
local iname = item:get_name()
|
||||
local heal = 0
|
||||
|
||||
if self._inv_id then
|
||||
if not self._chest and item:get_name() == "mcl_chests:chest" then
|
||||
item:take_item()
|
||||
clicker:set_wielded_item(item)
|
||||
self._chest = true
|
||||
-- Update texture
|
||||
if not self._naked_texture then
|
||||
-- Base horse texture without chest or saddle
|
||||
self._naked_texture = self.base_texture[2]
|
||||
end
|
||||
local tex = horse_extra_texture(self)
|
||||
self.base_texture = tex
|
||||
self.object:set_properties({textures = self.base_texture})
|
||||
get_drops(self)
|
||||
return
|
||||
elseif self._chest and clicker:get_player_control().sneak then
|
||||
mcl_entity_invs.show_inv_form(self,clicker)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- Taming
|
||||
self.temper = self.temper or (math.random(1,100))
|
||||
|
||||
|
@ -385,7 +341,6 @@ local horse = {
|
|||
self.base_texture = tex
|
||||
self.object:set_properties({textures = self.base_texture})
|
||||
minetest.sound_play({name = "mcl_armor_equip_leather"}, {gain=0.5, max_hear_distance=12, pos=self.object:get_pos()}, true)
|
||||
get_drops(self)
|
||||
|
||||
-- Put on horse armor if tamed
|
||||
elseif can_equip_horse_armor(self.name) and not self.driver and not self._horse_armor
|
||||
|
@ -564,9 +519,8 @@ donkey.collisionbox = {
|
|||
donkey.jump = true
|
||||
donkey.jump_height = 3.75 -- can clear 1 block height
|
||||
|
||||
|
||||
mcl_mobs:register_mob("mobs_mc:donkey", donkey)
|
||||
mcl_entity_invs.register_inv("mobs_mc:donkey","Donkey",15,true)
|
||||
|
||||
-- Mule
|
||||
local m = 0.94
|
||||
local mule = table.copy(donkey)
|
||||
|
@ -584,7 +538,6 @@ mule.collisionbox = {
|
|||
horse.collisionbox[6] * m,
|
||||
}
|
||||
mcl_mobs:register_mob("mobs_mc:mule", mule)
|
||||
mcl_entity_invs.register_inv("mobs_mc:mule","Mule",15,true)
|
||||
|
||||
--===========================
|
||||
--Spawn Function
|
||||
|
@ -635,8 +588,8 @@ mobs_mc.water_level+3,
|
|||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:horse", S("Horse"), "#c09e7d", "#eee500", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:skeleton_horse", S("Skeleton Horse"), "#68684f", "#e5e5d8", 0)
|
||||
--mobs:register_egg("mobs_mc:zombie_horse", S("Zombie Horse"), "#2a5a37", "#84d080", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:donkey", S("Donkey"), "#534539", "#867566", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:mule", S("Mule"), "#1b0200", "#51331d", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:horse", S("Horse"), "mobs_mc_spawn_icon_horse.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:skeleton_horse", S("Skeleton Horse"), "mobs_mc_spawn_icon_horse_skeleton.png", 0)
|
||||
--mobs:register_egg("mobs_mc:zombie_horse", S("Zombie Horse"), "mobs_mc_spawn_icon_horse_zombie.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:donkey", S("Donkey"), "mobs_mc_spawn_icon_donkey.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:mule", S("Mule"), "mobs_mc_spawn_icon_mule.png", 0)
|
||||
|
|
|
@ -22,9 +22,6 @@ mcl_mobs:register_mob("mobs_mc:iron_golem", {
|
|||
collisionbox = {-0.7, -0.01, -0.7, 0.7, 2.69, 0.7},
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_iron_golem.b3d",
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 3.38,
|
||||
curiosity = 10,
|
||||
textures = {
|
||||
{"mobs_mc_iron_golem.png"},
|
||||
},
|
||||
|
@ -96,7 +93,8 @@ mcl_mobs:register_mob("mobs_mc:iron_golem", {
|
|||
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:iron_golem", S("Iron Golem"), "#3b3b3b", "#f57223", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:iron_golem", S("Iron Golem"), "mobs_mc_spawn_icon_iron_golem.png", 0)
|
||||
|
||||
|
||||
--[[ This is to be called when a pumpkin or jack'o lantern has been placed. Recommended: In the on_construct function of the node.
|
||||
This summons an iron golen if placing the pumpkin created an iron golem summon pattern:
|
||||
|
|
|
@ -24,29 +24,6 @@ local carpets = {
|
|||
unicolor_light_blue = { "mcl_wool:light_blue_carpet", "light_blue" },
|
||||
}
|
||||
|
||||
local function get_drops(self)
|
||||
self.drops = {}
|
||||
table.insert(self.drops,
|
||||
{name = "mcl_mobitems:leather",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
looting = "common",
|
||||
})
|
||||
if self.carpet then
|
||||
table.insert(self.drops,{name = self.carpet,
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,})
|
||||
end
|
||||
if self._has_chest then
|
||||
table.insert(self.drops,{name = "mcl_chests:chest",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,})
|
||||
end
|
||||
end
|
||||
|
||||
mcl_mobs:register_mob("mobs_mc:llama", {
|
||||
description = S("Llama"),
|
||||
type = "animal",
|
||||
|
@ -58,14 +35,6 @@ mcl_mobs:register_mob("mobs_mc:llama", {
|
|||
shoot_offset = 1, --3.5 *would* be a good value visually but it somehow messes with the projectiles trajectory
|
||||
spawn_in_group_min = 4,
|
||||
spawn_in_group = 6,
|
||||
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 11,
|
||||
head_eye_height = 3,
|
||||
horrizonatal_head_height=0,
|
||||
curiosity = 60,
|
||||
head_yaw = "z",
|
||||
|
||||
hp_min = 15,
|
||||
hp_max = 30,
|
||||
xp_min = 1,
|
||||
|
@ -80,12 +49,14 @@ mcl_mobs:register_mob("mobs_mc:llama", {
|
|||
{"blank.png", "blank.png", "mobs_mc_llama_white.png"},
|
||||
{"blank.png", "blank.png", "mobs_mc_llama.png"},
|
||||
},
|
||||
visual_size = {x=3, y=3},
|
||||
makes_footstep_sound = true,
|
||||
runaway = false,
|
||||
walk_velocity = 1,
|
||||
run_velocity = 4.4,
|
||||
follow_velocity = 4.4,
|
||||
floats = 1,
|
||||
stay_near = { nodes = { "group:grass_block" } },
|
||||
drops = {
|
||||
{name = "mcl_mobitems:leather",
|
||||
chance = 1,
|
||||
|
@ -101,28 +72,36 @@ mcl_mobs:register_mob("mobs_mc:llama", {
|
|||
distance = 16,
|
||||
},
|
||||
animation = {
|
||||
stand_start = 0, stand_end = 0,
|
||||
walk_start = 0, walk_end = 40, walk_speed = 35,
|
||||
run_start = 0, run_end = 40, run_speed = 50,
|
||||
},
|
||||
child_animations = {
|
||||
stand_start = 41, stand_end = 41,
|
||||
walk_start = 41, walk_end = 81, walk_speed = 50,
|
||||
run_start = 41, run_end = 81, run_speed = 75,
|
||||
speed_normal = 24,
|
||||
run_speed = 60,
|
||||
run_start = 0,
|
||||
run_end = 40,
|
||||
stand_start = 0,
|
||||
stand_end = 0,
|
||||
walk_start = 0,
|
||||
walk_end = 40,
|
||||
hurt_start = 118,
|
||||
hurt_end = 154,
|
||||
death_start = 154,
|
||||
death_end = 179,
|
||||
eat_start = 49,
|
||||
eat_end = 78,
|
||||
look_start = 78,
|
||||
look_end = 108,
|
||||
},
|
||||
follow = { "mcl_farming:wheat_item", "mcl_farming:hay_block" },
|
||||
view_range = 16,
|
||||
do_custom = function(self, dtime)
|
||||
|
||||
-- set needed values if not already present
|
||||
if not self.v3 then
|
||||
self.v3 = 0
|
||||
if not self.v2 then
|
||||
self.v2 = 0
|
||||
self.max_speed_forward = 4
|
||||
self.max_speed_reverse = 2
|
||||
self.accel = 4
|
||||
self.terrain_type = 3
|
||||
self.driver_attach_at = {x = 0, y = 12.7, z = -5}
|
||||
self.driver_eye_offset = {x = 0, y = 6, z = 0}
|
||||
self.driver_attach_at = {x = 0, y = 4.17, z = -1.5}
|
||||
self.driver_eye_offset = {x = 0, y = 3, z = 0}
|
||||
self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y}
|
||||
end
|
||||
|
||||
|
@ -157,20 +136,6 @@ mcl_mobs:register_mob("mobs_mc:llama", {
|
|||
if item:get_name() == "mcl_farming:hay_block" then
|
||||
-- Breed with hay bale
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end
|
||||
elseif not self._has_chest and item:get_name() == "mcl_chests:chest" then
|
||||
item:take_item()
|
||||
clicker:set_wielded_item(item)
|
||||
self._has_chest = true
|
||||
self.base_texture = table.copy(self.base_texture)
|
||||
self.base_texture[1] = self.base_texture[3]
|
||||
self.object:set_properties({
|
||||
textures = self.base_texture,
|
||||
})
|
||||
get_drops(self)
|
||||
return
|
||||
elseif self._has_chest and clicker:get_player_control().sneak then
|
||||
mcl_entity_invs.show_inv_form(self,clicker," - Strength "..math.floor(self._inv_size / 3))
|
||||
return
|
||||
else
|
||||
-- Feed with anything else
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, false, true) then return end
|
||||
|
@ -179,36 +144,53 @@ mcl_mobs:register_mob("mobs_mc:llama", {
|
|||
|
||||
-- Make sure tamed llama is mature and being clicked by owner only
|
||||
if self.tamed and not self.child and self.owner == clicker:get_player_name() then
|
||||
-- Place carpet
|
||||
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
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:take_item()
|
||||
clicker:set_wielded_item(item)
|
||||
end
|
||||
local substr = carpetdata[2]
|
||||
local tex_carpet = "mobs_mc_llama_decor_"..substr..".png"
|
||||
self.base_texture = table.copy(self.base_texture)
|
||||
self.base_texture[2] = tex_carpet
|
||||
self.object:set_properties({
|
||||
textures = self.base_texture,
|
||||
})
|
||||
self.carpet = item:get_name()
|
||||
get_drops(self)
|
||||
return
|
||||
|
||||
-- Place carpet
|
||||
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
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:take_item()
|
||||
clicker:set_wielded_item(item)
|
||||
end
|
||||
local substr = carpetdata[2]
|
||||
local tex_carpet = "mobs_mc_llama_decor_"..substr..".png"
|
||||
self.base_texture = table.copy(self.base_texture)
|
||||
self.base_texture[2] = tex_carpet
|
||||
self.object:set_properties({
|
||||
textures = self.base_texture,
|
||||
})
|
||||
self.carpet = item:get_name()
|
||||
self.drops = {
|
||||
{name = "mcl_mobitems:leather",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,},
|
||||
{name = item:get_name(),
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,},
|
||||
}
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- detatch player already riding llama
|
||||
if self.driver and clicker == self.driver then
|
||||
mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||
-- attach player to llama
|
||||
elseif not self.driver then
|
||||
self.object:set_properties({stepheight = 1.1})
|
||||
mcl_mobs.attach(self, clicker)
|
||||
end
|
||||
-- detatch player already riding llama
|
||||
if self.driver and clicker == self.driver then
|
||||
|
||||
mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||
|
||||
-- attach player to llama
|
||||
elseif not self.driver then
|
||||
|
||||
self.object:set_properties({stepheight = 1.1})
|
||||
mcl_mobs.attach(self, clicker)
|
||||
end
|
||||
|
||||
-- Used to capture llama
|
||||
elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then
|
||||
mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
end
|
||||
end,
|
||||
|
||||
|
@ -233,25 +215,8 @@ mcl_mobs:register_mob("mobs_mc:llama", {
|
|||
return false
|
||||
end
|
||||
end,
|
||||
on_spawn = function(self)
|
||||
if not self._inv_size then
|
||||
local r = math.random(1000)
|
||||
if r < 80 then
|
||||
self._inv_size = 15
|
||||
elseif r < 160 then
|
||||
self._inv_size = 12
|
||||
elseif r < 488 then
|
||||
self._inv_size = 9
|
||||
elseif r < 816 then
|
||||
self._inv_size = 6
|
||||
else
|
||||
self._inv_size = 3
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
mcl_entity_invs.register_inv("mobs_mc:llama","Llama",nil,true)
|
||||
})
|
||||
|
||||
-- spit arrow (weapon)
|
||||
mcl_mobs:register_arrow("mobs_mc:llamaspit", {
|
||||
|
@ -267,6 +232,10 @@ mcl_mobs:register_arrow("mobs_mc:llamaspit", {
|
|||
end,
|
||||
|
||||
hit_mob = function(self, mob)
|
||||
mob:punch(self.object, 1.0, {
|
||||
full_punch_interval = 1.0,
|
||||
damage_groups = {fleshy = 1},
|
||||
}, nil)
|
||||
end,
|
||||
|
||||
hit_node = function(self, pos, node)
|
||||
|
@ -284,10 +253,12 @@ mcl_mobs:spawn_specific(
|
|||
"SavannaM_beach",
|
||||
"Savanna_beach",
|
||||
"Savanna_ocean",
|
||||
"JungleEdge",
|
||||
"JungleEdgeM",
|
||||
"ExtremeHills",
|
||||
"ExtremeHills_beach",
|
||||
"ExtremeHillsM",
|
||||
}, --FIXME: Needs Windswept Forest when that is added.
|
||||
},
|
||||
0,
|
||||
minetest.LIGHT_MAX+1,
|
||||
30,
|
||||
|
@ -297,4 +268,4 @@ mobs_mc.water_level+15,
|
|||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:llama", S("Llama"), "#c09e7d", "#995f40", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0)
|
||||
|
|
|
@ -36,18 +36,14 @@ local ocelot = {
|
|||
hp_max = 10,
|
||||
xp_min = 1,
|
||||
xp_max = 3,
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 6.2,
|
||||
head_eye_height = 0.4,
|
||||
horrizonatal_head_height=-0,
|
||||
head_yaw="z",
|
||||
curiosity = 4,
|
||||
collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.69, 0.3},
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_cat.b3d",
|
||||
textures = {"mobs_mc_cat_ocelot.png"},
|
||||
visual_size = {x=2.0, y=2.0},
|
||||
makes_footstep_sound = true,
|
||||
walk_chance = default_walk_chance,
|
||||
stay_near = { nodes = { "group:grass_block" ,"group:tree", "group:leaves"} },
|
||||
walk_velocity = 1,
|
||||
run_velocity = 3,
|
||||
follow_velocity = 1,
|
||||
|
@ -62,16 +58,14 @@ local ocelot = {
|
|||
distance = 16,
|
||||
},
|
||||
animation = {
|
||||
stand_start = 0, stand_end = 0,
|
||||
walk_start = 0, walk_end = 40, walk_speed = 40,
|
||||
run_start = 0, run_end = 40, run_speed = 50,
|
||||
sit_start = 50, sit_end = 50,
|
||||
},
|
||||
child_animations = {
|
||||
stand_start = 51, stand_end = 51,
|
||||
walk_start = 51, walk_end = 91, walk_speed = 60,
|
||||
run_start = 51, run_end = 91, run_speed = 75,
|
||||
sit_start = 101, sit_end = 101,
|
||||
speed_normal = 25,
|
||||
run_speed = 50,
|
||||
stand_start = 0,
|
||||
stand_end = 0,
|
||||
walk_start = 0,
|
||||
walk_end = 40,
|
||||
run_start = 0,
|
||||
run_end = 40,
|
||||
},
|
||||
follow = follow,
|
||||
view_range = 12,
|
||||
|
@ -239,4 +233,5 @@ mobs:spawn({
|
|||
]]--
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:ocelot", S("Ocelot"), "#efde7d", "#564434", 0)
|
||||
-- FIXME: The spawn icon shows a cat texture, not an ocelot texture
|
||||
mcl_mobs:register_egg("mobs_mc:ocelot", S("Ocelot"), "mobs_mc_spawn_icon_cat.png", 0)
|
||||
|
|
|
@ -127,18 +127,13 @@ end
|
|||
|
||||
mcl_mobs:register_mob("mobs_mc:parrot", {
|
||||
description = S("Parrot"),
|
||||
type = "animal",
|
||||
type = "passive",
|
||||
spawn_class = "passive",
|
||||
passive = true,
|
||||
pathfinding = 1,
|
||||
hp_min = 6,
|
||||
hp_max = 6,
|
||||
xp_min = 1,
|
||||
xp_max = 3,
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 1.1,
|
||||
horrizonatal_head_height=0,
|
||||
curiosity = 10,
|
||||
collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25},
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_parrot.b3d",
|
||||
|
@ -146,6 +141,9 @@ mcl_mobs:register_mob("mobs_mc:parrot", {
|
|||
visual_size = {x=3, y=3},
|
||||
walk_velocity = 3,
|
||||
run_velocity = 5,
|
||||
keep_flying = true,
|
||||
stay_near = { nodes = { "group:leaves" } },
|
||||
|
||||
sounds = {
|
||||
random = "mobs_mc_parrot_random",
|
||||
damage = {name="mobs_mc_parrot_hurt", gain=0.3},
|
||||
|
@ -168,11 +166,9 @@ mcl_mobs:register_mob("mobs_mc:parrot", {
|
|||
stand_end = 0,
|
||||
fly_start = 30,
|
||||
fly_end = 45,
|
||||
walk_start = 0,
|
||||
walk_end = 20,
|
||||
-- TODO: actual walk animation
|
||||
--walk_start = 0,
|
||||
--walk_end = 20,
|
||||
walk_start = 30,
|
||||
walk_end = 45,
|
||||
|
||||
-- TODO: more unused animations between 45 and 130
|
||||
},
|
||||
|
@ -241,4 +237,4 @@ mobs_mc.water_level+7,
|
|||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:parrot", S("Parrot"), "#0da70a", "#ff0000", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:parrot", S("Parrot"), "mobs_mc_spawn_icon_parrot.png", 0)
|
||||
|
|
|
@ -15,19 +15,16 @@ mcl_mobs:register_mob("mobs_mc:pig", {
|
|||
visual = "mesh",
|
||||
mesh = "mobs_mc_pig.b3d",
|
||||
textures = {{
|
||||
"blank.png", -- baby
|
||||
"mobs_mc_pig.png", -- base
|
||||
"blank.png", -- saddle
|
||||
}},
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 7.5,
|
||||
head_eye_height = 0.8,
|
||||
horrizonatal_head_height=-1,
|
||||
curiosity = 3,
|
||||
head_yaw="z",
|
||||
visual_size = {x=2.5, y=2.5},
|
||||
makes_footstep_sound = true,
|
||||
walk_velocity = 1,
|
||||
run_velocity = 3,
|
||||
follow_velocity = 3.4,
|
||||
stay_near = { nodes = { "group:grass_block" } },
|
||||
drops = {
|
||||
{name = "mcl_mobitems:porkchop",
|
||||
chance = 1,
|
||||
|
@ -44,14 +41,15 @@ mcl_mobs:register_mob("mobs_mc:pig", {
|
|||
distance = 16,
|
||||
},
|
||||
animation = {
|
||||
stand_start = 0, stand_end = 0,
|
||||
walk_start = 0, walk_end = 40, walk_speed = 60,
|
||||
run_start = 0, run_end = 40, run_speed = 90,
|
||||
},
|
||||
child_animations = {
|
||||
stand_start = 41, stand_end = 41,
|
||||
walk_start = 41, walk_end = 81, walk_speed = 90,
|
||||
run_start = 41, run_end = 81, run_speed = 135,
|
||||
stand_speed = 40,
|
||||
walk_speed = 40,
|
||||
run_speed = 90,
|
||||
stand_start = 0,
|
||||
stand_end = 0,
|
||||
walk_start = 0,
|
||||
walk_end = 40,
|
||||
run_start = 0,
|
||||
run_end = 40,
|
||||
},
|
||||
follow = {
|
||||
"mcl_farming:potato_item",
|
||||
|
@ -63,17 +61,15 @@ mcl_mobs:register_mob("mobs_mc:pig", {
|
|||
do_custom = function(self, dtime)
|
||||
|
||||
-- set needed values if not already present
|
||||
if not self.v3 then
|
||||
self.v3 = 0
|
||||
if not self.v2 then
|
||||
self.v2 = 0
|
||||
self.max_speed_forward = 4
|
||||
self.max_speed_reverse = 2
|
||||
self.accel = 4
|
||||
self.terrain_type = 3
|
||||
self.driver_attach_at = {x = 0.0, y = 6.5, z = -3.75}
|
||||
self.driver_attach_at = {x = 0.0, y = 2.75, z = -1.5}
|
||||
self.driver_eye_offset = {x = 0, y = 3, z = 0}
|
||||
self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y}
|
||||
self.base_texture = self.texture_list[1]
|
||||
self.object:set_properties({textures = self.base_texture})
|
||||
end
|
||||
|
||||
-- if driver present allow control of horse
|
||||
|
@ -116,6 +112,7 @@ mcl_mobs:register_mob("mobs_mc:pig", {
|
|||
local item = clicker:get_wielded_item()
|
||||
if item:get_name() == "mcl_mobitems:saddle" and self.saddle ~= "yes" then
|
||||
self.base_texture = {
|
||||
"blank.png", -- baby
|
||||
"mobs_mc_pig.png", -- base
|
||||
"mobs_mc_pig_saddle.png", -- saddle
|
||||
}
|
||||
|
@ -238,4 +235,4 @@ mcl_vars.mg_overworld_min,
|
|||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:pig", S("Pig"), "#f0a5a2", "#db635f", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:pig", S("Pig"), "mobs_mc_spawn_icon_pig.png", 0)
|
||||
|
|
|
@ -41,7 +41,6 @@ pillager = {
|
|||
fear_height = 4,
|
||||
arrow = "mcl_bows:arrow_entity",
|
||||
attack_type = "dogshoot", -- Alternate punching/shooting
|
||||
attack_npcs = true,
|
||||
reach = 0, -- Punching max distance
|
||||
damage = 0, -- Punching damage
|
||||
dogshoot_switch = 1, -- Start of shooting
|
||||
|
@ -120,4 +119,4 @@ pillager = {
|
|||
}
|
||||
|
||||
mcl_mobs:register_mob("mobs_mc:pillager", pillager)
|
||||
mcl_mobs:register_egg("mobs_mc:pillager", S("Pillager"), "#532f36", "#959b9b", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:pillager", S("Pillager"), "mobs_mc_spawn_icon_pillager.png", 0)
|
||||
|
|
|
@ -24,12 +24,6 @@ mcl_mobs:register_mob("mobs_mc:polar_bear", {
|
|||
textures = {
|
||||
{"mobs_mc_polarbear.png"},
|
||||
},
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 2.6,
|
||||
head_eye_height = 1,
|
||||
horrizonatal_head_height = 0,
|
||||
curiosity = 20,
|
||||
head_yaw="z",
|
||||
visual_size = {x=3.0, y=3.0},
|
||||
makes_footstep_sound = true,
|
||||
damage = 6,
|
||||
|
@ -92,4 +86,4 @@ mcl_vars.mg_overworld_min,
|
|||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn egg
|
||||
mcl_mobs:register_egg("mobs_mc:polar_bear", S("Polar Bear"), "#f2f2f2", "#959590", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:polar_bear", S("Polar Bear"), "mobs_mc_spawn_icon_polarbear.png", 0)
|
||||
|
|
|
@ -15,12 +15,7 @@ local rabbit = {
|
|||
xp_min = 1,
|
||||
xp_max = 3,
|
||||
collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.49, 0.2},
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 2,
|
||||
head_eye_height = 0.5,
|
||||
horrizonatal_head_height = -.3,
|
||||
curiosity = 20,
|
||||
head_yaw="z",
|
||||
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_rabbit.b3d",
|
||||
textures = {
|
||||
|
@ -31,6 +26,7 @@ local rabbit = {
|
|||
{"mobs_mc_rabbit_salt.png"},
|
||||
{"mobs_mc_rabbit_black.png"},
|
||||
},
|
||||
visual_size = {x=1.5, y=1.5},
|
||||
sounds = {
|
||||
random = "mobs_mc_rabbit_random",
|
||||
damage = "mobs_mc_rabbit_hurt",
|
||||
|
@ -44,6 +40,7 @@ local rabbit = {
|
|||
run_velocity = 3.7,
|
||||
follow_velocity = 1.1,
|
||||
floats = 1,
|
||||
stay_near = { nodes = { "group:grass_block", "group:sand", "mcl_core:sand" } },
|
||||
runaway = true,
|
||||
jump = true,
|
||||
drops = {
|
||||
|
@ -53,14 +50,10 @@ local rabbit = {
|
|||
},
|
||||
fear_height = 4,
|
||||
animation = {
|
||||
stand_start = 0, stand_end = 0,
|
||||
walk_start = 0, walk_end = 20, walk_speed = 20,
|
||||
run_start = 0, run_end = 20, run_speed = 30,
|
||||
},
|
||||
child_animations = {
|
||||
stand_start = 21, stand_end = 21,
|
||||
walk_start = 21, walk_end = 41, walk_speed = 30,
|
||||
run_start = 21, run_end = 41, run_speed = 45,
|
||||
speed_normal = 25, speed_run = 50,
|
||||
stand_start = 0, stand_end = 0,
|
||||
walk_start = 0, walk_end = 20,
|
||||
run_start = 0, run_end = 20,
|
||||
},
|
||||
-- Follow (yellow) dangelions, carrots and golden carrots
|
||||
follow = {
|
||||
|
@ -213,7 +206,7 @@ mcl_mobs:spawn(spawn_grass)
|
|||
]]--
|
||||
|
||||
-- Spawn egg
|
||||
mcl_mobs:register_egg("mobs_mc:rabbit", S("Rabbit"), "#995f40", "#734831", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:rabbit", S("Rabbit"), "mobs_mc_spawn_icon_rabbit.png", 0)
|
||||
|
||||
-- Note: This spawn egg does not exist in Minecraft
|
||||
mcl_mobs:register_egg("mobs_mc:killer_bunny", S("Killer Bunny"), "#f2f2f2", "#ff0000", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:killer_bunny", S("Killer Bunny"), "mobs_mc_spawn_icon_rabbit.png^[colorize:#FF0000:192", 0) -- TODO: Update inventory image
|
||||
|
|
|
@ -51,7 +51,8 @@ local salmon = {
|
|||
makes_footstep_sound = false,
|
||||
swim = true,
|
||||
fly = true,
|
||||
fly_in = "mcl_core:water_source",
|
||||
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
|
||||
stay_near = { nodes = { "group:water" } },
|
||||
breathes_in_water = true,
|
||||
jump = false,
|
||||
view_range = 16,
|
||||
|
@ -225,4 +226,4 @@ water-16,
|
|||
water+1)
|
||||
|
||||
--spawn egg
|
||||
mcl_mobs:register_egg("mobs_mc:salmon", S("Salmon"), "#a00f10", "#0e8474", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:salmon", S("Salmon"), "extra_mobs_spawn_icon_salmon.png", 0)
|
||||
|
|
|
@ -61,13 +61,9 @@ mcl_mobs:register_mob("mobs_mc:sheep", {
|
|||
xp_min = 1,
|
||||
xp_max = 3,
|
||||
collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.29, 0.45},
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 3.3,
|
||||
head_eye_height = 1.1,
|
||||
horrizonatal_head_height=-.7,
|
||||
curiosity = 6,
|
||||
head_yaw="z",
|
||||
|
||||
visual = "mesh",
|
||||
visual_size = {x=3, y=3},
|
||||
mesh = "mobs_mc_sheepfur.b3d",
|
||||
textures = { sheep_texture("unicolor_white") },
|
||||
gotten_texture = gotten_texture,
|
||||
|
@ -76,6 +72,7 @@ mcl_mobs:register_mob("mobs_mc:sheep", {
|
|||
walk_velocity = 1,
|
||||
runaway = true,
|
||||
runaway_from = {"mobs_mc:wolf"},
|
||||
stay_near = { nodes = { "group:grass_block" } },
|
||||
drops = {
|
||||
{name = "mcl_mobitems:mutton",
|
||||
chance = 1,
|
||||
|
@ -97,14 +94,10 @@ mcl_mobs:register_mob("mobs_mc:sheep", {
|
|||
distance = 16,
|
||||
},
|
||||
animation = {
|
||||
stand_start = 0, stand_end = 0,
|
||||
walk_start = 0, walk_end = 40, walk_speed = 30,
|
||||
run_start = 0, run_end = 40, run_speed = 40,
|
||||
},
|
||||
child_animations = {
|
||||
stand_start = 81, stand_end = 81,
|
||||
walk_start = 81, walk_end = 121, walk_speed = 45,
|
||||
run_start = 81, run_end = 121, run_speed = 60,
|
||||
speed_normal = 25, run_speed = 65,
|
||||
stand_start = 40, stand_end = 80,
|
||||
walk_start = 0, walk_end = 40,
|
||||
run_start = 0, run_end = 40,
|
||||
},
|
||||
follow = { "mcl_farming:wheat_item" },
|
||||
view_range = 12,
|
||||
|
@ -365,4 +358,4 @@ mcl_vars.mg_overworld_min,
|
|||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:sheep", S("Sheep"), "#e7e7e7", "#ffb5b5", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:sheep", S("Sheep"), "mobs_mc_spawn_icon_sheep.png", 0)
|
||||
|
|
|
@ -9,27 +9,8 @@ local S = minetest.get_translator("mobs_mc")
|
|||
--################### SHULKER
|
||||
--###################
|
||||
|
||||
local adjacents = {
|
||||
vector.new(1,0,0),
|
||||
vector.new(-1,0,0),
|
||||
vector.new(0,1,0),
|
||||
vector.new(0,-1,0),
|
||||
vector.new(0,0,1),
|
||||
vector.new(0,0,-1),
|
||||
}
|
||||
local function check_spot(pos)
|
||||
pos = vector.offset(pos,0,0.5,0)
|
||||
local n = minetest.get_node(pos)
|
||||
if n.name ~="air" then return false end
|
||||
for _,a in pairs(adjacents) do
|
||||
local p = vector.add(pos,a)
|
||||
local pn = minetest.get_node(p)
|
||||
if minetest.get_item_group(pn.name,"solid") > 0 then return true end
|
||||
end
|
||||
return false
|
||||
end
|
||||
local pr = PseudoRandom(os.time()*(-334))
|
||||
-- animation 45-80 is transition between passive and attack stance
|
||||
|
||||
mcl_mobs:register_mob("mobs_mc:shulker", {
|
||||
description = S("Shulker"),
|
||||
type = "monster",
|
||||
|
@ -45,17 +26,19 @@ mcl_mobs:register_mob("mobs_mc:shulker", {
|
|||
xp_max = 5,
|
||||
armor = 150,
|
||||
collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.99, 0.5},
|
||||
visual = "mesh",
|
||||
visual = "cube",
|
||||
mesh = "mobs_mc_shulker.b3d",
|
||||
textures = { "mobs_mc_endergolem.png", },
|
||||
textures = {
|
||||
"mobs_mc_endergolem.png",
|
||||
"mobs_mc_endergolem.png",
|
||||
"mobs_mc_endergolem.png",
|
||||
},
|
||||
-- TODO: sounds
|
||||
-- TODO: Make shulker dye-able
|
||||
visual_size = {x=3, y=3},
|
||||
visual_size = {x=1, y=1},
|
||||
walk_chance = 0,
|
||||
knock_back = false,
|
||||
jump = false,
|
||||
can_despawn = false,
|
||||
fall_speed = 0,
|
||||
drops = {
|
||||
{name = "mcl_mobitems:shulker_shell",
|
||||
chance = 2,
|
||||
|
@ -65,90 +48,15 @@ mcl_mobs:register_mob("mobs_mc:shulker", {
|
|||
looting_factor = 0.0625},
|
||||
},
|
||||
animation = {
|
||||
stand_speed = 25, walk_speed = 0, run_speed = 50, punch_speed = 25,
|
||||
stand_speed = 25, walk_speed = 25, run_speed = 50, punch_speed = 25,
|
||||
speed_normal = 25, speed_run = 50,
|
||||
stand_start = 0, stand_end = 25,
|
||||
walk_start = 25, walk_end = 45,
|
||||
run_start = 45, run_end = 85,
|
||||
stand_start = 0, stand_end = 45,
|
||||
walk_start = 0, walk_end = 45,
|
||||
run_start = 0, run_end = 45,
|
||||
punch_start = 80, punch_end = 100,
|
||||
},
|
||||
view_range = 16,
|
||||
fear_height = 0,
|
||||
noyaw = true,
|
||||
do_custom = function(self,dtime)
|
||||
local pos = self.object:get_pos()
|
||||
if math.floor(self.object:get_yaw()) ~=0 then
|
||||
self.object:set_yaw(0)
|
||||
mcl_mobs:yaw(self, 0, 0, dtime)
|
||||
end
|
||||
if self.state == "walk" or self.state == "stand" then
|
||||
self.state = "stand"
|
||||
mcl_mobs:set_animation(self, "stand")
|
||||
end
|
||||
if self.state == "attack" then
|
||||
mcl_mobs:set_animation(self, "punch")
|
||||
end
|
||||
self.path.way = false
|
||||
self.look_at_players = false
|
||||
if not check_spot(pos) then
|
||||
self:teleport(nil)
|
||||
end
|
||||
end,
|
||||
do_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)
|
||||
self:teleport(puncher)
|
||||
end,
|
||||
do_teleport = function(self, target)
|
||||
if target ~= nil then
|
||||
local target_pos = target:get_pos()
|
||||
-- Find all solid nodes below air in a 10×10×10 cuboid centered on the target
|
||||
local nodes = minetest.find_nodes_in_area_under_air(vector.subtract(target_pos, 5), vector.add(target_pos, 5), {"group:solid", "group:cracky", "group:crumbly"})
|
||||
local telepos
|
||||
if nodes ~= nil then
|
||||
if #nodes > 0 then
|
||||
-- Up to 64 attempts to teleport
|
||||
for n=1, math.min(64, #nodes) do
|
||||
local r = pr:next(1, #nodes)
|
||||
local nodepos = nodes[r]
|
||||
local tg = vector.offset(nodepos,0,1,0)
|
||||
if check_spot(tg) then
|
||||
telepos = tg
|
||||
node_ok = true
|
||||
end
|
||||
end
|
||||
if telepos then
|
||||
self.object:set_pos(telepos)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
local pos = self.object:get_pos()
|
||||
-- Up to 8 top-level attempts to teleport
|
||||
for n=1, 8 do
|
||||
local node_ok = false
|
||||
-- We need to add (or subtract) different random numbers to each vector component, so it couldn't be done with a nice single vector.add() or .subtract():
|
||||
local randomCube = vector.new( pos.x + 8*(pr:next(0,16)-8), pos.y + 8*(pr:next(0,16)-8), pos.z + 8*(pr:next(0,16)-8) )
|
||||
local nodes = minetest.find_nodes_in_area_under_air(vector.subtract(randomCube, 4), vector.add(randomCube, 4), {"group:solid", "group:cracky", "group:crumbly"})
|
||||
if nodes ~= nil then
|
||||
if #nodes > 0 then
|
||||
-- Up to 8 low-level (in total up to 8*8 = 64) attempts to teleport
|
||||
for n=1, math.min(8, #nodes) do
|
||||
local r = pr:next(1, #nodes)
|
||||
local nodepos = nodes[r]
|
||||
local tg = vector.offset(nodepos,0,1,0)
|
||||
if check_spot(tg) then
|
||||
self.object:set_pos(tg)
|
||||
node_ok = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if node_ok then
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
fear_height = 4,
|
||||
})
|
||||
|
||||
-- bullet arrow (weapon)
|
||||
|
@ -177,9 +85,8 @@ mcl_mobs:register_arrow("mobs_mc:shulkerbullet", {
|
|||
})
|
||||
|
||||
|
||||
mcl_mobs:register_egg("mobs_mc:shulker", S("Shulker"), "#946694", "#4d3852", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0)
|
||||
|
||||
--[[
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:shulker",
|
||||
"end",
|
||||
|
@ -194,4 +101,3 @@ minetest.LIGHT_MAX+1,
|
|||
2,
|
||||
mcl_vars.mg_end_min,
|
||||
mcl_vars.mg_end_max)
|
||||
--]]
|
||||
|
|
|
@ -56,7 +56,7 @@ mcl_mobs:register_mob("mobs_mc:silverfish", {
|
|||
reach = 1,
|
||||
})
|
||||
|
||||
mcl_mobs:register_egg("mobs_mc:silverfish", S("Silverfish"), "#6d6d6d", "#313131", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:silverfish", S("Silverfish"), "mobs_mc_spawn_icon_silverfish.png", 0)
|
||||
|
||||
-- Monster egg blocks (Minetest Game)
|
||||
if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then
|
||||
|
|
|
@ -25,15 +25,13 @@ local skeleton = {
|
|||
collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.98, 0.3},
|
||||
pathfinding = 1,
|
||||
group_attack = true,
|
||||
head_swivel = "Head_Control",
|
||||
bone_eye_height = 2.38,
|
||||
curiosity = 6,
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_skeleton.b3d",
|
||||
textures = { {
|
||||
"mcl_bows_bow_0.png", -- bow
|
||||
"mobs_mc_skeleton.png", -- skeleton
|
||||
} },
|
||||
visual_size = {x=1, y=1},
|
||||
makes_footstep_sound = true,
|
||||
textures = {
|
||||
{
|
||||
|
@ -80,27 +78,11 @@ local skeleton = {
|
|||
run_speed = 30,
|
||||
shoot_start = 70,
|
||||
shoot_end = 90,
|
||||
jockey_start = 172,
|
||||
jockey_end = 172,
|
||||
die_start = 160,
|
||||
die_end = 170,
|
||||
die_speed = 15,
|
||||
die_loop = false,
|
||||
},
|
||||
jock = "mobs_mc:spider",
|
||||
on_spawn = function(self)
|
||||
self.jockey = false
|
||||
if math.random(100) == 1 then -- 1% like from MCwiki
|
||||
self.jockey = true
|
||||
local jock = minetest.add_entity(self.object:get_pos(), "mobs_mc:spider")
|
||||
jock:get_luaentity().docile_by_day = false
|
||||
self.object:set_attach(jock, "", vector.new(0,0,0), vector.new(0,0,0))
|
||||
end
|
||||
return true
|
||||
end,
|
||||
on_detach=function(self, parent)
|
||||
self.jockey = false
|
||||
end,
|
||||
ignited_by_sunlight = true,
|
||||
view_range = 16,
|
||||
fear_height = 4,
|
||||
|
@ -108,9 +90,6 @@ local skeleton = {
|
|||
arrow = "mcl_bows:arrow_entity",
|
||||
shoot_arrow = function(self, pos, dir)
|
||||
if mod_bows then
|
||||
if self.attack then
|
||||
self.object:set_yaw(minetest.dir_to_yaw(vector.direction(self.object:get_pos(), self.attack:get_pos())))
|
||||
end
|
||||
-- 2-4 damage per arrow
|
||||
local dmg = math.max(4, math.random(2, 8))
|
||||
mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg)
|
||||
|
@ -350,6 +329,5 @@ mcl_vars.mg_overworld_max)
|
|||
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:skeleton", S("Skeleton"), "#c1c1c1", "#494949", 0)
|
||||
|
||||
mcl_mobs:register_egg("mobs_mc:stray", S("Stray"), "#5f7476", "#dae8e7", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:skeleton", S("Skeleton"), "mobs_mc_spawn_icon_skeleton.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:stray", S("Stray"), "mobs_mc_spawn_icon_stray.png", 0)
|
||||
|
|
|
@ -24,14 +24,11 @@ mcl_mobs:register_mob("mobs_mc:witherskeleton", {
|
|||
collisionbox = {-0.35, -0.01, -0.35, 0.35, 2.39, 0.35},
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_witherskeleton.b3d",
|
||||
head_swivel = "head.control",
|
||||
bone_eye_height = 2.38,
|
||||
curiosity = 60,
|
||||
textures = {
|
||||
{
|
||||
"mobs_mc_empty.png", -- armor
|
||||
"default_tool_stonesword.png", -- sword
|
||||
"mobs_mc_wither_skeleton.png", -- wither skeleton
|
||||
"default_tool_stonesword.png", -- sword
|
||||
}
|
||||
},
|
||||
visual_size = {x=1.2, y=1.2},
|
||||
|
@ -116,4 +113,4 @@ mcl_vars.mg_nether_min,
|
|||
mcl_vars.mg_nether_max)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "#141414", "#474d4d", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "mobs_mc_spawn_icon_witherskeleton.png", 0)
|
||||
|
|
|
@ -447,6 +447,5 @@ mmin,
|
|||
mmax)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "#350000", "#fcfc00")
|
||||
|
||||
mcl_mobs:register_egg("mobs_mc:slime_big", S("Slime"), "#52a03e", "#7ebf6d")
|
||||
mcl_mobs:register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "mobs_mc_spawn_icon_magmacube.png")
|
||||
mcl_mobs:register_egg("mobs_mc:slime_big", S("Slime"), "mobs_mc_spawn_icon_slime.png")
|
||||
|
|
|
@ -196,4 +196,4 @@ function mobs_mc.check_snow_golem_summon(pos)
|
|||
end
|
||||
|
||||
-- Spawn egg
|
||||
mcl_mobs:register_egg("mobs_mc:snowman", S("Snow Golem"), "#f2f2f2", "#fd8f47", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:snowman", S("Snow Golem"), "mobs_mc_spawn_icon_snowman.png", 0)
|
||||
|
|
|
@ -11,22 +11,6 @@ local S = minetest.get_translator("mobs_mc")
|
|||
|
||||
|
||||
-- Spider by AspireMint (fishyWET (CC-BY-SA 3.0 license for texture)
|
||||
minetest.register_entity("mobs_mc:spider_eyes", {
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_spider.b3d",
|
||||
visual_size = {x=1.01/3, y=1.01/3},
|
||||
textures = {
|
||||
"mobs_mc_spider_eyes.png",
|
||||
},
|
||||
on_step = function(self)
|
||||
if self and self.object then
|
||||
if not self.object:get_attach() then
|
||||
self.object:remove()
|
||||
end
|
||||
end
|
||||
end,
|
||||
glow = 50,
|
||||
})
|
||||
|
||||
local spider = {
|
||||
description = S("Spider"),
|
||||
|
@ -43,38 +27,13 @@ local spider = {
|
|||
xp_min = 5,
|
||||
xp_max = 5,
|
||||
armor = {fleshy = 100, arthropod = 100},
|
||||
on_spawn = function(self)
|
||||
self.object:set_properties({visual_size={x=1,y=1}})
|
||||
local spider_eyes=false
|
||||
for n = 1, #self.object:get_children() do
|
||||
local obj = self.object:get_children()[n]
|
||||
if obj:get_luaentity() and self.object:get_luaentity().name == "mobs_mc:spider_eyes" then
|
||||
spider_eyes = true
|
||||
end
|
||||
end
|
||||
if not spider_eyes then
|
||||
minetest.add_entity(self.object:get_pos(), "mobs_mc:spider_eyes"):set_attach(self.object, "body.head", vector.new(0,-0.98,2), vector.new(90,180,180))
|
||||
end
|
||||
end,
|
||||
on_die=function(self)
|
||||
if self.object:get_children() and self.object:get_children()[1] then
|
||||
self.object:get_children()[1]:set_detach()
|
||||
end
|
||||
end,
|
||||
detach_child=function(self, child)
|
||||
child:get_luaentity().jockey = false
|
||||
end,
|
||||
head_swivel = "Head_Control",
|
||||
bone_eye_height = 1,
|
||||
curiosity = 10,
|
||||
head_yaw="z",
|
||||
collisionbox = {-0.7, -0.01, -0.7, 0.7, 0.89, 0.7},
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_spider.b3d",
|
||||
textures = {
|
||||
{"mobs_mc_spider.png"},
|
||||
{"mobs_mc_spider.png^(mobs_mc_spider_eyes.png^[makealpha:0,0,0)"},
|
||||
},
|
||||
visual_size = {x=1, y=1},
|
||||
visual_size = {x=3, y=3},
|
||||
makes_footstep_sound = false,
|
||||
sounds = {
|
||||
random = "mobs_mc_spider_random",
|
||||
|
@ -279,5 +238,5 @@ mcl_vars.mg_overworld_min,
|
|||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:spider", S("Spider"), "#342d26", "#a80e0e", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:cave_spider", S("Cave Spider"), "#0c424e", "#a80e0e", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:spider", S("Spider"), "mobs_mc_spawn_icon_spider.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:cave_spider", S("Cave Spider"), "mobs_mc_spawn_icon_cave_spider.png", 0)
|
||||
|
|
|
@ -50,6 +50,7 @@ mcl_mobs:register_mob("mobs_mc:squid", {
|
|||
makes_footstep_sound = false,
|
||||
fly = true,
|
||||
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
|
||||
stay_near = { nodes = { "group:water" } },
|
||||
breathes_in_water = true,
|
||||
jump = false,
|
||||
view_range = 16,
|
||||
|
@ -217,4 +218,4 @@ water-16,
|
|||
water+1)
|
||||
|
||||
-- spawn eggs
|
||||
mcl_mobs:register_egg("mobs_mc:squid", S("Squid"), "#223b4d", "#708999", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:squid", S("Squid"), "mobs_mc_spawn_icon_squid.png", 0)
|
||||
|
|
Before Width: | Height: | Size: 298 B After Width: | Height: | Size: 766 B |
Before Width: | Height: | Size: 357 B After Width: | Height: | Size: 830 B |
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 353 B |
Before Width: | Height: | Size: 192 B After Width: | Height: | Size: 275 B |
Before Width: | Height: | Size: 230 B After Width: | Height: | Size: 978 B |