update fork #6
|
@ -102,6 +102,8 @@ Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times
|
|||
* `water_bucket=1`: Bucket containing a liquid of group “water”
|
||||
* `enchantability=X`: How good the enchantments are the item gets (1 equals book)
|
||||
* `enchanted=1`: The item is already enchanted, meaning that it can't be enchanted using an enchanting table
|
||||
* `cobble=1`: Cobblestone of any kind
|
||||
* `soul_block`: Fire burning on these blocks turns to soul fire, can be used to craft soul torch
|
||||
|
||||
### Material groups
|
||||
|
||||
|
@ -203,6 +205,9 @@ These groups are used mostly for informational purposes
|
|||
* `building_block=1`: Block is a building block
|
||||
* `deco_block=1`: Block is a decorational block
|
||||
|
||||
* `blast_furnace_smeltable=1` : Item or node is smeltable by a blast furnace
|
||||
* `smoker_cookable=1` : Food is cookable by a smoker.
|
||||
|
||||
|
||||
## Fake item groups
|
||||
These groups put similar items together which should all be treated by the gameplay or the GUI as a single item.
|
||||
|
|
|
@ -14,7 +14,7 @@ mcl_damage = {
|
|||
cactus = {},
|
||||
fall = {bypasses_armor = true},
|
||||
fly_into_wall = {bypasses_armor = true}, -- unused
|
||||
out_of_world = {bypasses_armor = true, bypasses_magic = true, bypasses_invulnerability = true},
|
||||
out_of_world = {bypasses_armor = true, bypasses_magic = true, bypasses_invulnerability = true, bypasses_totem = true},
|
||||
generic = {bypasses_armor = true},
|
||||
magic = {is_magic = true, bypasses_armor = true},
|
||||
dragon_breath = {is_magic = true, bypasses_armor = true}, -- this is only used for dragon fireball; dragon fireball does not actually deal impact damage tho, so this is unreachable
|
||||
|
@ -78,7 +78,7 @@ function mcl_damage.from_punch(mcl_reason, object)
|
|||
mcl_reason.type = "arrow"
|
||||
elseif luaentity._is_fireball then
|
||||
mcl_reason.type = "fireball"
|
||||
elseif luaentity._cmi_is_mob then
|
||||
elseif luaentity.is_mob then
|
||||
mcl_reason.type = "mob"
|
||||
end
|
||||
mcl_reason.source = mcl_reason.source or luaentity._source_object
|
||||
|
|
|
@ -524,7 +524,7 @@ function mcl_util.deal_damage(target, damage, mcl_reason)
|
|||
if luaentity.deal_damage then
|
||||
luaentity:deal_damage(damage, mcl_reason or {type = "generic"})
|
||||
return
|
||||
elseif luaentity._cmi_is_mob then
|
||||
elseif luaentity.is_mob then
|
||||
-- local puncher = mcl_reason and mcl_reason.direct or target
|
||||
-- target:punch(puncher, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy = damage}}, vector.direction(puncher:get_pos(), target:get_pos()), damage)
|
||||
if luaentity.health > 0 then
|
||||
|
@ -544,7 +544,7 @@ end
|
|||
function mcl_util.get_hp(obj)
|
||||
local luaentity = obj:get_luaentity()
|
||||
|
||||
if luaentity and luaentity._cmi_is_mob then
|
||||
if luaentity and luaentity.is_mob then
|
||||
return luaentity.health
|
||||
else
|
||||
return obj:get_hp()
|
||||
|
@ -603,7 +603,7 @@ function mcl_util.get_pointed_thing(player, liquid)
|
|||
local look_dir = vector.multiply(player:get_look_dir(), 5)
|
||||
local pos2 = vector.add(pos, look_dir)
|
||||
local ray = minetest.raycast(pos, pos2, false, liquid)
|
||||
|
||||
|
||||
if ray then
|
||||
for pointed_thing in ray do
|
||||
return pointed_thing
|
||||
|
|
|
@ -314,7 +314,7 @@ function boat.on_step(self, dtime, moveresult)
|
|||
|
||||
for _, obj in pairs(minetest.get_objects_inside_radius(self.object:get_pos(), 1.3)) do
|
||||
local entity = obj:get_luaentity()
|
||||
if entity and entity._cmi_is_mob then
|
||||
if entity and entity.is_mob then
|
||||
attach_object(self, obj)
|
||||
break
|
||||
end
|
||||
|
|
|
@ -418,7 +418,11 @@ minetest.register_entity(":__builtin:item", {
|
|||
end
|
||||
local stack = ItemStack(itemstring)
|
||||
if minetest.get_item_group(stack:get_name(), "compass") > 0 then
|
||||
stack:set_name("mcl_compass:16")
|
||||
if string.find(stack:get_name(), "_lodestone") then
|
||||
stack:set_name("mcl_compass:18_lodestone")
|
||||
else
|
||||
stack:set_name("mcl_compass:18")
|
||||
end
|
||||
itemstring = stack:to_string()
|
||||
self.itemstring = itemstring
|
||||
end
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
|
||||
-- API for Mobs Redo: MineClone 2 Edition (MRM)
|
||||
|
||||
mobs = {}
|
||||
mobs.mod = "mrm"
|
||||
mobs.version = "20210106" -- don't rely too much on this, rarely updated, if ever
|
||||
mcl_mobs = {}
|
||||
|
||||
local MAX_MOB_NAME_LENGTH = 30
|
||||
local HORNY_TIME = 30
|
||||
|
@ -13,6 +11,8 @@ local DEATH_DELAY = 0.5
|
|||
local DEFAULT_FALL_SPEED = -10
|
||||
local FLOP_HEIGHT = 5.0
|
||||
local FLOP_HOR_SPEED = 1.5
|
||||
local ENTITY_CRAMMING_MAX = 24
|
||||
local CRAMMING_DAMAGE = 3
|
||||
|
||||
local MOB_CAP = {}
|
||||
MOB_CAP.hostile = 70
|
||||
|
@ -23,22 +23,8 @@ MOB_CAP.water = 15
|
|||
-- Localize
|
||||
local S = minetest.get_translator("mcl_mobs")
|
||||
|
||||
-- CMI support check
|
||||
local use_cmi = minetest.global_exists("cmi")
|
||||
|
||||
|
||||
-- Invisibility mod check
|
||||
mobs.invis = {}
|
||||
if minetest.global_exists("invisibility") then
|
||||
mobs.invis = invisibility
|
||||
end
|
||||
|
||||
|
||||
-- creative check
|
||||
function mobs.is_creative(name)
|
||||
return minetest.is_creative_enabled(name)
|
||||
end
|
||||
|
||||
mcl_mobs.invis = {}
|
||||
|
||||
-- localize math functions
|
||||
local pi = math.pi
|
||||
|
@ -50,6 +36,7 @@ local max = math.max
|
|||
local atann = math.atan
|
||||
local random = math.random
|
||||
local floor = math.floor
|
||||
|
||||
local atan = function(x)
|
||||
if not x or x ~= x then
|
||||
return 0
|
||||
|
@ -91,15 +78,26 @@ local stuck_path_timeout = 10 -- how long will mob follow path before giving up
|
|||
local node_ice = "mcl_core:ice"
|
||||
local node_snowblock = "mcl_core:snowblock"
|
||||
local node_snow = "mcl_core:snow"
|
||||
mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt"
|
||||
mcl_mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt"
|
||||
|
||||
local mod_weather = minetest.get_modpath("mcl_weather") ~= nil
|
||||
local mod_explosions = minetest.get_modpath("mcl_explosions") ~= nil
|
||||
local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil
|
||||
local mod_hunger = minetest.get_modpath("mcl_hunger") ~= nil
|
||||
local mod_worlds = minetest.get_modpath("mcl_worlds") ~= nil
|
||||
local mod_armor = minetest.get_modpath("mcl_armor") ~= nil
|
||||
local mod_experience = minetest.get_modpath("mcl_experience") ~= nil
|
||||
minetest.register_chatcommand("clearmobs",{
|
||||
privs={maphack=true},
|
||||
params = "<all>|<nametagged>|<range>",
|
||||
description=S("Removes all spawned mobs except nametagged and tamed ones. all removes all mobs, nametagged only nametagged ones and with the range paramter all mobs in a distance of the current player are removed."),
|
||||
func=function(n,param)
|
||||
local p = minetest.get_player_by_name(n)
|
||||
local num=tonumber(param)
|
||||
for _,o in pairs(minetest.luaentities) do
|
||||
if o.is_mob then
|
||||
if param == "all" or
|
||||
( param == "nametagged" and o.nametag ) or
|
||||
( param == "" and not o.nametag and not o.tamed ) or
|
||||
( num and num > 0 and vector.distance(p:get_pos(),o.object:get_pos()) <= num ) then
|
||||
o.object:remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
end})
|
||||
|
||||
----For Water Flowing:
|
||||
local enable_physics = function(object, luaentity, ignore_check)
|
||||
|
@ -176,7 +174,7 @@ local function object_in_range(self, object)
|
|||
end
|
||||
local factor
|
||||
-- Apply view range reduction for special player armor
|
||||
if object:is_player() and mod_armor then
|
||||
if object:is_player() then
|
||||
local factors = mcl_armor.player_view_range_factors[object]
|
||||
factor = factors and factors[self.name]
|
||||
end
|
||||
|
@ -223,7 +221,7 @@ local collision = function(self)
|
|||
for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do
|
||||
|
||||
local ent = object:get_luaentity()
|
||||
if object:is_player() or (ent and ent._cmi_is_mob and object ~= self.object) then
|
||||
if object:is_player() or (ent and ent.is_mob and object ~= self.object) then
|
||||
|
||||
local pos2 = object:get_pos()
|
||||
local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z}
|
||||
|
@ -330,7 +328,7 @@ local set_yaw = function(self, yaw, delay, dtime)
|
|||
end
|
||||
|
||||
-- global function to set mob yaw
|
||||
function mobs:yaw(self, yaw, delay, dtime)
|
||||
function mcl_mobs:yaw(self, yaw, delay, dtime)
|
||||
set_yaw(self, yaw, delay, dtime)
|
||||
end
|
||||
|
||||
|
@ -365,6 +363,35 @@ local remove_texture_mod = function(self, mod)
|
|||
self.object:set_texture_mod(full_mod)
|
||||
end
|
||||
|
||||
-- are we flying in what we are suppose to? (taikedz)
|
||||
local flight_check = function(self)
|
||||
|
||||
local nod = self.standing_in
|
||||
local def = minetest.registered_nodes[nod]
|
||||
|
||||
if not def then return false end -- nil check
|
||||
|
||||
local fly_in
|
||||
if type(self.fly_in) == "string" then
|
||||
fly_in = { self.fly_in }
|
||||
elseif type(self.fly_in) == "table" then
|
||||
fly_in = self.fly_in
|
||||
else
|
||||
return false
|
||||
end
|
||||
|
||||
for _,checknode in pairs(fly_in) do
|
||||
if nod == checknode then
|
||||
return true
|
||||
elseif checknode == "__airlike" or def.walkable == false and
|
||||
(def.liquidtype == "none" or minetest.get_item_group(nod, "fake_liquid") == 1) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
-- set defined animation
|
||||
local set_animation = function(self, anim, fixed_frame)
|
||||
if not self.animation or not anim then
|
||||
|
@ -374,6 +401,8 @@ local set_animation = function(self, anim, fixed_frame)
|
|||
return
|
||||
end
|
||||
|
||||
if flight_check(self) and self.fly and anim == "walk" then anim = "fly" end
|
||||
|
||||
self.animation.current = self.animation.current or ""
|
||||
|
||||
if (anim == self.animation.current
|
||||
|
@ -401,7 +430,7 @@ end
|
|||
|
||||
|
||||
-- above function exported for mount.lua
|
||||
function mobs:set_animation(self, anim)
|
||||
function mcl_mobs:set_animation(self, anim)
|
||||
set_animation(self, anim)
|
||||
end
|
||||
|
||||
|
@ -515,37 +544,6 @@ local line_of_sight = function(self, pos1, pos2, stepsize)
|
|||
return false
|
||||
end
|
||||
|
||||
|
||||
-- are we flying in what we are suppose to? (taikedz)
|
||||
local flight_check = function(self)
|
||||
|
||||
local nod = self.standing_in
|
||||
local def = minetest.registered_nodes[nod]
|
||||
|
||||
if not def then return false end -- nil check
|
||||
|
||||
local fly_in
|
||||
if type(self.fly_in) == "string" then
|
||||
fly_in = { self.fly_in }
|
||||
elseif type(self.fly_in) == "table" then
|
||||
fly_in = self.fly_in
|
||||
else
|
||||
return false
|
||||
end
|
||||
|
||||
for _,checknode in pairs(fly_in) do
|
||||
if nod == checknode then
|
||||
return true
|
||||
elseif checknode == "__airlike" and def.walkable == false and
|
||||
(def.liquidtype == "none" or minetest.get_item_group(nod, "fake_liquid") == 1) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
-- custom particle effects
|
||||
local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down)
|
||||
|
||||
|
@ -605,7 +603,7 @@ local damage_effect = function(self, damage)
|
|||
end
|
||||
end
|
||||
|
||||
mobs.death_effect = function(pos, yaw, collisionbox, rotate)
|
||||
mcl_mobs.death_effect = function(pos, yaw, collisionbox, rotate)
|
||||
local min, max
|
||||
if collisionbox then
|
||||
min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]}
|
||||
|
@ -819,7 +817,7 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
local looting = mcl_enchanting.get_enchantment(wielditem, "looting")
|
||||
item_drop(self, cooked, looting)
|
||||
|
||||
if mod_experience and ((not self.child) or self.type ~= "animal") and (minetest.get_us_time() - self.xp_timestamp <= 5000000) then
|
||||
if ((not self.child) or self.type ~= "animal") and (minetest.get_us_time() - self.xp_timestamp <= 5000000) then
|
||||
mcl_experience.throw_xp(self.object:get_pos(), math.random(self.xp_min, self.xp_max))
|
||||
end
|
||||
end
|
||||
|
@ -834,10 +832,6 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
death_handle(self)
|
||||
end
|
||||
|
||||
if use_cmi then
|
||||
cmi.notify_die(self.object, cmi_cause)
|
||||
end
|
||||
|
||||
if on_die_exit == true then
|
||||
self.state = "die"
|
||||
mcl_burning.extinguish(self.object)
|
||||
|
@ -897,9 +891,6 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
if not self.object:get_luaentity() then
|
||||
return
|
||||
end
|
||||
if use_cmi then
|
||||
cmi.notify_die(self.object, cmi_cause)
|
||||
end
|
||||
|
||||
death_handle(self)
|
||||
local dpos = self.object:get_pos()
|
||||
|
@ -907,7 +898,7 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
local yaw = self.object:get_rotation().y
|
||||
mcl_burning.extinguish(self.object)
|
||||
self.object:remove()
|
||||
mobs.death_effect(dpos, yaw, cbox, not self.instant_death)
|
||||
mcl_mobs.death_effect(dpos, yaw, cbox, not self.instant_death)
|
||||
end
|
||||
if length <= 0 then
|
||||
kill(self)
|
||||
|
@ -1019,7 +1010,7 @@ end
|
|||
-- get node but use fallback for nil or unknown
|
||||
local node_ok = function(pos, fallback)
|
||||
|
||||
fallback = fallback or mobs.fallback_node
|
||||
fallback = fallback or mcl_mobs.fallback_node
|
||||
|
||||
local node = minetest.get_node_or_nil(pos)
|
||||
|
||||
|
@ -1070,7 +1061,7 @@ local do_env_damage = function(self)
|
|||
|
||||
-- Deal light damage to mob, returns true if mob died
|
||||
local deal_light_damage = function(self, pos, damage)
|
||||
if not (mod_weather and (mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then
|
||||
if not ((mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then
|
||||
self.health = self.health - damage
|
||||
|
||||
effect(pos, 5, "mcl_particles_smoke.png")
|
||||
|
@ -1091,10 +1082,7 @@ local do_env_damage = function(self)
|
|||
return true
|
||||
end
|
||||
end
|
||||
local _, dim = nil, "overworld"
|
||||
if mod_worlds then
|
||||
_, dim = mcl_worlds.y_to_layer(pos.y)
|
||||
end
|
||||
local _, dim = mcl_worlds.y_to_layer(pos.y)
|
||||
if (self.sunlight_damage ~= 0 or self.ignited_by_sunlight) and (sunlight or 0) >= minetest.LIGHT_MAX and dim == "overworld" then
|
||||
if self.ignited_by_sunlight then
|
||||
mcl_burning.set_on_fire(self.object, 10)
|
||||
|
@ -1124,7 +1112,7 @@ local do_env_damage = function(self)
|
|||
local nodef = minetest.registered_nodes[self.standing_in]
|
||||
|
||||
-- rain
|
||||
if self.rain_damage > 0 and mod_weather then
|
||||
if self.rain_damage > 0 then
|
||||
if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then
|
||||
|
||||
self.health = self.health - self.rain_damage
|
||||
|
@ -1415,8 +1403,9 @@ end
|
|||
|
||||
-- should mob follow what I'm holding ?
|
||||
local follow_holding = function(self, clicker)
|
||||
if self.nofollow then return false end
|
||||
|
||||
if mobs.invis[clicker:get_player_name()] then
|
||||
if mcl_mobs.invis[clicker:get_player_name()] then
|
||||
return false
|
||||
end
|
||||
|
||||
|
@ -1554,10 +1543,7 @@ local breed = function(self)
|
|||
return
|
||||
end
|
||||
|
||||
-- Give XP
|
||||
if mod_experience then
|
||||
mcl_experience.throw_xp(pos, math.random(1, 7))
|
||||
end
|
||||
mcl_experience.throw_xp(pos, math.random(1, 7))
|
||||
|
||||
-- custom breed function
|
||||
if parent1.on_breed then
|
||||
|
@ -1567,7 +1553,7 @@ local breed = function(self)
|
|||
end
|
||||
end
|
||||
|
||||
local child = mobs:spawn_child(pos, parent1.name)
|
||||
local child = mcl_mobs:spawn_child(pos, parent1.name)
|
||||
|
||||
local ent_c = child:get_luaentity()
|
||||
|
||||
|
@ -1803,7 +1789,7 @@ local smart_mobs = function(self, s, p, dist, dtime)
|
|||
|
||||
if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then
|
||||
|
||||
minetest.set_node(s, {name = mobs.fallback_node})
|
||||
minetest.set_node(s, {name = mcl_mobs.fallback_node})
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -1938,7 +1924,7 @@ local monster_attack = function(self)
|
|||
|
||||
if objs[n]:is_player() then
|
||||
|
||||
if mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then
|
||||
if mcl_mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then
|
||||
type = ""
|
||||
else
|
||||
player = objs[n]
|
||||
|
@ -2067,7 +2053,7 @@ local runaway_from = function(self)
|
|||
|
||||
if objs[n]:is_player() then
|
||||
|
||||
if mobs.invis[ objs[n]:get_player_name() ]
|
||||
if mcl_mobs.invis[ objs[n]:get_player_name() ]
|
||||
or self.owner == objs[n]:get_player_name()
|
||||
or (not object_in_range(self, objs[n])) then
|
||||
type = ""
|
||||
|
@ -2149,7 +2135,7 @@ local follow_flop = function(self)
|
|||
for n = 1, #players do
|
||||
|
||||
if (object_in_range(self, players[n]))
|
||||
and not mobs.invis[ players[n]:get_player_name() ] then
|
||||
and not mcl_mobs.invis[ players[n]:get_player_name() ] then
|
||||
|
||||
self.following = players[n]
|
||||
|
||||
|
@ -2294,17 +2280,50 @@ local dogswitch = function(self, dtime)
|
|||
return self.dogshoot_switch
|
||||
end
|
||||
|
||||
local function go_to_pos(entity,b)
|
||||
if not entity then return end
|
||||
local s=entity.object:get_pos()
|
||||
if vector.distance(b,s) < 1 then
|
||||
--set_velocity(entity,0)
|
||||
return true
|
||||
end
|
||||
local v = { x = b.x - s.x, z = b.z - s.z }
|
||||
local yaw = (math.atan(v.z / v.x) + math.pi / 2) - entity.rotate
|
||||
if b.x > s.x then yaw = yaw + math.pi end
|
||||
entity.object:set_yaw(yaw)
|
||||
set_velocity(entity,entity.follow_velocity)
|
||||
mcl_mobs:set_animation(entity, "walk")
|
||||
end
|
||||
|
||||
local function check_doors(self)
|
||||
local p = self.object:get_pos()
|
||||
local t = minetest.get_timeofday()
|
||||
local dd = minetest.find_nodes_in_area(vector.offset(p,-1,-1,-1),vector.offset(p,1,1,1),{"group:door"})
|
||||
for _,d in pairs(dd) do
|
||||
local n = minetest.get_node(d)
|
||||
if n.name:find("_b_") then
|
||||
local def = minetest.registered_nodes[n.name]
|
||||
local closed = n.name:find("_b_1")
|
||||
if t < 0.3 or t > 0.8 then
|
||||
if not closed then def.on_rightclick(d,n,self) end
|
||||
else
|
||||
if closed then def.on_rightclick(d,n,self) end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- execute current state (stand, walk, run, attacks)
|
||||
-- returns true if mob has died
|
||||
local do_states = function(self, dtime)
|
||||
if self.can_open_doors then check_doors(self) end
|
||||
|
||||
local yaw = self.object:get_yaw() or 0
|
||||
|
||||
if self.state == "stand" then
|
||||
|
||||
if random(1, 4) == 1 then
|
||||
|
||||
local lp = nil
|
||||
local s = self.object:get_pos()
|
||||
local objs = minetest.get_objects_inside_radius(s, 3)
|
||||
|
||||
|
@ -2317,7 +2336,7 @@ local do_states = function(self, dtime)
|
|||
end
|
||||
|
||||
-- look at any players nearby, otherwise turn randomly
|
||||
if lp then
|
||||
if self.look_at_players then
|
||||
|
||||
local vec = {
|
||||
x = lp.x - s.x,
|
||||
|
@ -2352,8 +2371,35 @@ local do_states = function(self, dtime)
|
|||
end
|
||||
end
|
||||
|
||||
elseif self.state == "walk" then
|
||||
elseif self.state == "gowp" then
|
||||
local p = self.object:get_pos()
|
||||
if not p or not self._target then return end
|
||||
if vector.distance(p,self._target) < 2 or ( self.waypoints and #self.waypoints == 0 ) then
|
||||
self.waypoints = nil
|
||||
self._target = nil
|
||||
self.current_target = nil
|
||||
self.state = "walk"
|
||||
if self.callback_arrived then return self.callback_arrived(self) end
|
||||
return true
|
||||
end
|
||||
if self.waypoints and ( not self.current_target or vector.distance(p,self.current_target) < 1.5 ) then
|
||||
self.current_target = table.remove(self.waypoints, 1)
|
||||
--minetest.log("nextwp:".. tostring(self.current_target) )
|
||||
elseif self.current_target then
|
||||
go_to_pos(self,self.current_target)
|
||||
end
|
||||
|
||||
if self.current_target and not minetest.line_of_sight(self.object:get_pos(),self.current_target) then
|
||||
self.waypoints=minetest.find_path(p,self._target,150,1,4)
|
||||
self.current_target = nil
|
||||
return
|
||||
end
|
||||
if not self.current_target then
|
||||
--minetest.log("no path")
|
||||
self.state = "walk"
|
||||
end
|
||||
|
||||
elseif self.state == "walk" then
|
||||
local s = self.object:get_pos()
|
||||
local lp = nil
|
||||
|
||||
|
@ -2492,7 +2538,7 @@ local do_states = function(self, dtime)
|
|||
or not self.attack:get_pos()
|
||||
or not object_in_range(self, self.attack)
|
||||
or self.attack:get_hp() <= 0
|
||||
or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then
|
||||
or (self.attack:is_player() and mcl_mobs.invis[ self.attack:get_player_name() ]) then
|
||||
|
||||
self.state = "stand"
|
||||
set_velocity(self, 0)
|
||||
|
@ -2583,7 +2629,6 @@ local do_states = function(self, dtime)
|
|||
|
||||
local pos = self.object:get_pos()
|
||||
|
||||
if mod_explosions then
|
||||
if mobs_griefing and not minetest.is_protected(pos, "") then
|
||||
mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object)
|
||||
else
|
||||
|
@ -2596,7 +2641,6 @@ local do_states = function(self, dtime)
|
|||
entity_physics(pos, entity_damage_radius)
|
||||
effect(pos, 32, "mcl_particles_smoke.png", nil, nil, node_break_radius, 1, 0)
|
||||
end
|
||||
end
|
||||
mcl_burning.extinguish(self.object)
|
||||
self.object:remove()
|
||||
|
||||
|
@ -2857,6 +2901,106 @@ local do_states = function(self, dtime)
|
|||
end
|
||||
end
|
||||
|
||||
local plane_adjacents = {
|
||||
vector.new(1,0,0),
|
||||
vector.new(-1,0,0),
|
||||
vector.new(0,0,1),
|
||||
vector.new(0,0,-1),
|
||||
}
|
||||
|
||||
function mcl_mobs:gopath(self,target,callback_arrived)
|
||||
local p = self.object:get_pos()
|
||||
local t = vector.offset(target,0,1,0)
|
||||
local wp = minetest.find_path(p,t,150,1,4)
|
||||
if not wp then
|
||||
local d = minetest.find_node_near(target,16,{"group:door"})
|
||||
if d then
|
||||
for _,v in pairs(plane_adjacents) do
|
||||
local pos = vector.add(d,v)
|
||||
local n = minetest.get_node(pos)
|
||||
if n.name == "air" then
|
||||
wp = minetest.find_path(p,pos,150,1,4)
|
||||
if wp then break end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if wp and #wp > 0 then
|
||||
self._target = t
|
||||
self.callback_arrived = callback_arrived
|
||||
self.waypoints = wp
|
||||
self.state = "gowp"
|
||||
return true
|
||||
else
|
||||
--minetest.log("no path found")
|
||||
end
|
||||
end
|
||||
|
||||
local function player_near(pos)
|
||||
for _,o in pairs(minetest.get_objects_inside_radius(pos,2)) do
|
||||
if o:is_player() then return true end
|
||||
end
|
||||
end
|
||||
|
||||
local function check_item_pickup(self)
|
||||
if self.pick_up and #self.pick_up > 0 then
|
||||
local p = self.object:get_pos()
|
||||
for _,o in pairs(minetest.get_objects_inside_radius(p,2)) do
|
||||
local l=o:get_luaentity()
|
||||
if l and l.name == "__builtin:item" then
|
||||
for k,v in pairs(self.pick_up) do
|
||||
if not player_near(p) and self.on_pick_up and l.itemstring:find(v) then
|
||||
if self.on_pick_up(self,l) == nil then o:remove() end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function damage_mob(self,reason,damage)
|
||||
if not self.health then return end
|
||||
damage = floor(damage)
|
||||
if damage > 0 then
|
||||
self.health = self.health - damage
|
||||
|
||||
effect(pos, 5, "mcl_particles_smoke.png", 1, 2, 2, nil)
|
||||
|
||||
if check_for_death(self, reason, {type = reason}) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function check_entity_cramming(self)
|
||||
local p = self.object:get_pos()
|
||||
local oo = minetest.get_objects_inside_radius(p,1)
|
||||
local mobs = {}
|
||||
for _,o in pairs(oo) do
|
||||
local l = o:get_luaentity()
|
||||
if l and l.is_mob and l.health > 0 then table.insert(mobs,l) end
|
||||
end
|
||||
local clear = #mobs < ENTITY_CRAMMING_MAX
|
||||
local ncram = {}
|
||||
for _,l in pairs(mobs) do
|
||||
if l then
|
||||
if clear then
|
||||
l.cram = nil
|
||||
elseif l.cram == nil and not self.child then
|
||||
table.insert(ncram,l)
|
||||
elseif l.cram then
|
||||
damage_mob(l,"cramming",CRAMMING_DAMAGE)
|
||||
end
|
||||
end
|
||||
end
|
||||
for i,l in pairs(ncram) do
|
||||
if i > ENTITY_CRAMMING_MAX then
|
||||
l.cram = true
|
||||
else
|
||||
l.cram = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- falling and fall damage
|
||||
-- returns true if mob died
|
||||
|
@ -2935,16 +3079,7 @@ local falling = function(self, pos)
|
|||
if add ~= 0 then
|
||||
damage = damage + damage * (add/100)
|
||||
end
|
||||
damage = floor(damage)
|
||||
if damage > 0 then
|
||||
self.health = self.health - damage
|
||||
|
||||
effect(pos, 5, "mcl_particles_smoke.png", 1, 2, 2, nil)
|
||||
|
||||
if check_for_death(self, "fall", {type = "fall"}) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
damage_mob(self,"fall",damage)
|
||||
end
|
||||
|
||||
self.old_y = self.object:get_pos().y
|
||||
|
@ -2997,7 +3132,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
|
|||
local punch_interval = 1.4
|
||||
|
||||
-- exhaust attacker
|
||||
if mod_hunger and is_player then
|
||||
if is_player then
|
||||
mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK)
|
||||
end
|
||||
|
||||
|
@ -3011,23 +3146,19 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
|
|||
tflp = 0.2
|
||||
end
|
||||
|
||||
if use_cmi then
|
||||
damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir)
|
||||
else
|
||||
|
||||
for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do
|
||||
for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do
|
||||
|
||||
tmp = tflp / (tool_capabilities.full_punch_interval or 1.4)
|
||||
tmp = tflp / (tool_capabilities.full_punch_interval or 1.4)
|
||||
|
||||
if tmp < 0 then
|
||||
tmp = 0.0
|
||||
elseif tmp > 1 then
|
||||
tmp = 1.0
|
||||
end
|
||||
|
||||
damage = damage + (tool_capabilities.damage_groups[group] or 0)
|
||||
* tmp * ((armor[group] or 0) / 100.0)
|
||||
if tmp < 0 then
|
||||
tmp = 0.0
|
||||
elseif tmp > 1 then
|
||||
tmp = 1.0
|
||||
end
|
||||
|
||||
damage = damage + (tool_capabilities.damage_groups[group] or 0)
|
||||
* tmp * ((armor[group] or 0) / 100.0)
|
||||
end
|
||||
|
||||
if weapon then
|
||||
|
@ -3053,13 +3184,6 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
|
|||
return
|
||||
end
|
||||
|
||||
if use_cmi then
|
||||
|
||||
local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage)
|
||||
|
||||
if cancel then return end
|
||||
end
|
||||
|
||||
if tool_capabilities then
|
||||
punch_interval = tool_capabilities.full_punch_interval or 1.4
|
||||
end
|
||||
|
@ -3193,7 +3317,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
|
|||
and self.state ~= "flop"
|
||||
and (self.child == false or self.type == "monster")
|
||||
and hitter:get_player_name() ~= self.owner
|
||||
and not mobs.invis[ name ] then
|
||||
and not mcl_mobs.invis[ name ] then
|
||||
|
||||
if not die then
|
||||
-- attack whoever punched mob
|
||||
|
@ -3267,10 +3391,6 @@ local mob_staticdata = function(self)
|
|||
self.following = nil
|
||||
self.state = "stand"
|
||||
|
||||
if use_cmi then
|
||||
self.serialized_cmi_components = cmi.serialize_components(self._cmi_components)
|
||||
end
|
||||
|
||||
local tmp = {}
|
||||
|
||||
for _,stat in pairs(self) do
|
||||
|
@ -3448,25 +3568,16 @@ local mob_activate = function(self, staticdata, def, dtime)
|
|||
if def.after_activate then
|
||||
def.after_activate(self, staticdata, def, dtime)
|
||||
end
|
||||
|
||||
if use_cmi then
|
||||
self._cmi_components = cmi.activate_components(self.serialized_cmi_components)
|
||||
cmi.notify_activate(self.object, dtime)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- main mob function
|
||||
local mob_step = function(self, dtime)
|
||||
|
||||
check_item_pickup(self)
|
||||
if not self.fire_resistant then
|
||||
mcl_burning.tick(self.object, dtime, self)
|
||||
end
|
||||
|
||||
if use_cmi then
|
||||
cmi.notify_step(self.object, dtime)
|
||||
end
|
||||
|
||||
local pos = self.object:get_pos()
|
||||
local yaw = 0
|
||||
|
||||
|
@ -3553,8 +3664,7 @@ local mob_step = function(self, dtime)
|
|||
-- attack timer
|
||||
self.timer = self.timer + dtime
|
||||
|
||||
if self.state ~= "attack" then
|
||||
|
||||
if self.state ~= "attack" and self.state ~= "gowp" then
|
||||
if self.timer < 1 then
|
||||
return
|
||||
end
|
||||
|
@ -3577,7 +3687,7 @@ local mob_step = function(self, dtime)
|
|||
|
||||
if (self.state == "attack" and self.env_damage_timer > 1)
|
||||
or self.state ~= "attack" then
|
||||
|
||||
check_entity_cramming(self)
|
||||
self.env_damage_timer = 0
|
||||
|
||||
-- check for environmental damage (water, fire, lava etc.)
|
||||
|
@ -3702,7 +3812,7 @@ local do_tnt = function(obj, damage)
|
|||
end
|
||||
|
||||
|
||||
mobs.spawning_mobs = {}
|
||||
mcl_mobs.spawning_mobs = {}
|
||||
|
||||
-- Code to execute before custom on_rightclick handling
|
||||
local on_rightclick_prefix = function(self, clicker)
|
||||
|
@ -3720,7 +3830,7 @@ local on_rightclick_prefix = function(self, clicker)
|
|||
|
||||
update_tag(self)
|
||||
|
||||
if not mobs.is_creative(clicker:get_player_name()) then
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:take_item()
|
||||
clicker:set_wielded_item(item)
|
||||
end
|
||||
|
@ -3741,9 +3851,9 @@ local create_mob_on_rightclick = function(on_rightclick)
|
|||
end
|
||||
|
||||
-- register mob entity
|
||||
function mobs:register_mob(name, def)
|
||||
function mcl_mobs:register_mob(name, def)
|
||||
|
||||
mobs.spawning_mobs[name] = true
|
||||
mcl_mobs.spawning_mobs[name] = true
|
||||
|
||||
local can_despawn
|
||||
if def.can_despawn ~= nil then
|
||||
|
@ -3822,6 +3932,8 @@ minetest.register_entity(name, {
|
|||
sounds = def.sounds or {},
|
||||
animation = def.animation,
|
||||
follow = def.follow,
|
||||
nofollow = def.nofollow,
|
||||
can_open_doors = def.can_open_doors,
|
||||
jump = def.jump ~= false,
|
||||
walk_chance = def.walk_chance or 50,
|
||||
attacks_monsters = def.attacks_monsters or false,
|
||||
|
@ -3872,7 +3984,7 @@ minetest.register_entity(name, {
|
|||
runaway_from = def.runaway_from,
|
||||
owner_loyal = def.owner_loyal,
|
||||
facing_fence = false,
|
||||
_cmi_is_mob = true,
|
||||
is_mob = true,
|
||||
pushable = def.pushable or true,
|
||||
|
||||
|
||||
|
@ -3887,7 +3999,8 @@ minetest.register_entity(name, {
|
|||
child = def.child or false,
|
||||
texture_mods = {},
|
||||
shoot_arrow = def.shoot_arrow,
|
||||
sounds_child = def.sounds_child,
|
||||
sounds_child = def.sounds_child,
|
||||
pick_up = def.pick_up,
|
||||
explosion_strength = def.explosion_strength,
|
||||
suffocation_timer = 0,
|
||||
follow_velocity = def.follow_velocity or 2.4,
|
||||
|
@ -3911,12 +4024,15 @@ minetest.register_entity(name, {
|
|||
|
||||
on_grown = def.on_grown,
|
||||
|
||||
on_pick_up = def.on_pick_up,
|
||||
|
||||
on_detach_child = mob_detach_child,
|
||||
|
||||
on_activate = function(self, staticdata, dtime)
|
||||
--this is a temporary hack so mobs stop
|
||||
--glitching and acting really weird with the
|
||||
--default built in engine collision detection
|
||||
self.is_mob = true
|
||||
self.object:set_properties({
|
||||
collide_with_objects = false,
|
||||
})
|
||||
|
@ -3935,11 +4051,11 @@ if minetest.get_modpath("doc_identifier") ~= nil then
|
|||
doc.sub.identifier.register_object(name, "basics", "mobs")
|
||||
end
|
||||
|
||||
end -- END mobs:register_mob function
|
||||
end -- END mcl_mobs:register_mob function
|
||||
|
||||
|
||||
-- register arrow for shoot attack
|
||||
function mobs:register_arrow(name, def)
|
||||
function mcl_mobs:register_arrow(name, def)
|
||||
|
||||
if not name or not def then return end -- errorcheck
|
||||
|
||||
|
@ -4041,7 +4157,7 @@ function mobs:register_arrow(name, def)
|
|||
|
||||
if entity
|
||||
and self.hit_mob
|
||||
and entity._cmi_is_mob == true
|
||||
and entity.is_mob == true
|
||||
and tostring(player) ~= self.owner_id
|
||||
and entity.name ~= self.object:get_luaentity().name then
|
||||
self.hit_mob(self, player)
|
||||
|
@ -4051,7 +4167,7 @@ function mobs:register_arrow(name, def)
|
|||
|
||||
if entity
|
||||
and self.hit_object
|
||||
and (not entity._cmi_is_mob)
|
||||
and (not entity.is_mob)
|
||||
and tostring(player) ~= self.owner_id
|
||||
and entity.name ~= self.object:get_luaentity().name then
|
||||
self.hit_object(self, player)
|
||||
|
@ -4068,7 +4184,7 @@ end
|
|||
|
||||
|
||||
-- no damage to nodes explosion
|
||||
function mobs:safe_boom(self, pos, strength)
|
||||
function mcl_mobs:safe_boom(self, pos, strength)
|
||||
minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", {
|
||||
pos = pos,
|
||||
gain = 1.0,
|
||||
|
@ -4081,15 +4197,11 @@ end
|
|||
|
||||
|
||||
-- make explosion with protection and tnt mod check
|
||||
function mobs:boom(self, pos, strength, fire)
|
||||
if mod_explosions then
|
||||
if mobs_griefing and not minetest.is_protected(pos, "") then
|
||||
mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object)
|
||||
else
|
||||
mobs:safe_boom(self, pos, strength)
|
||||
end
|
||||
function mcl_mobs:boom(self, pos, strength, fire)
|
||||
if mobs_griefing and not minetest.is_protected(pos, "") then
|
||||
mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object)
|
||||
else
|
||||
mobs:safe_boom(self, pos, strength)
|
||||
mcl_mobs:safe_boom(self, pos, strength)
|
||||
end
|
||||
|
||||
-- delete the object after it punched the player to avoid nil entities in e.g. mcl_shields!!
|
||||
|
@ -4102,7 +4214,7 @@ end
|
|||
-- Note: This also introduces the “spawn_egg” group:
|
||||
-- * spawn_egg=1: Spawn egg (generic mob, no metadata)
|
||||
-- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata)
|
||||
function mobs:register_egg(mob, desc, background, addegg, no_creative)
|
||||
function mcl_mobs:register_egg(mob, desc, background, addegg, no_creative)
|
||||
|
||||
local grp = {spawn_egg = 1}
|
||||
|
||||
|
@ -4145,7 +4257,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
|
|||
|
||||
local name = placer:get_player_name()
|
||||
local privs = minetest.get_player_privs(name)
|
||||
if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then
|
||||
if under.name == "mcl_mobspawners:spawner" then
|
||||
if minetest.is_protected(pointed_thing.under, name) then
|
||||
minetest.record_protection_violation(pointed_thing.under, name)
|
||||
return itemstack
|
||||
|
@ -4155,7 +4267,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
|
|||
return itemstack
|
||||
end
|
||||
mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name())
|
||||
if not mobs.is_creative(name) then
|
||||
if not minetest.is_creative_enabled(name) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
|
@ -4195,7 +4307,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
|
|||
end
|
||||
|
||||
-- if not in creative then take item
|
||||
if not mobs.is_creative(placer:get_player_name()) then
|
||||
if not minetest.is_creative_enabled(placer:get_player_name()) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
end
|
||||
|
@ -4209,28 +4321,28 @@ end
|
|||
|
||||
-- No-op in MCL2 (capturing mobs is not possible).
|
||||
-- Provided for compability with Mobs Redo
|
||||
function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith)
|
||||
function mcl_mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith)
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
-- No-op in MCL2 (protecting mobs is not possible).
|
||||
function mobs:protect(self, clicker)
|
||||
function mcl_mobs:protect(self, clicker)
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
-- feeding, taming and breeding (thanks blert2112)
|
||||
function mobs:feed_tame(self, clicker, feed_count, breed, tame)
|
||||
function mcl_mobs:feed_tame(self, clicker, feed_count, breed, tame)
|
||||
if not self.follow then
|
||||
return false
|
||||
end
|
||||
|
||||
-- can eat/tame with item in hand
|
||||
if follow_holding(self, clicker) then
|
||||
if self.nofollow or follow_holding(self, clicker) then
|
||||
|
||||
-- if not in creative then take item
|
||||
if not mobs.is_creative(clicker:get_player_name()) then
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
|
||||
local item = clicker:get_wielded_item()
|
||||
|
||||
|
@ -4296,7 +4408,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame)
|
|||
end
|
||||
|
||||
-- Spawn a child
|
||||
function mobs:spawn_child(pos, mob_type)
|
||||
function mcl_mobs:spawn_child(pos, mob_type)
|
||||
local child = minetest.add_entity(pos, mob_type)
|
||||
if not child then
|
||||
return
|
||||
|
@ -4343,7 +4455,7 @@ end
|
|||
|
||||
|
||||
-- compatibility function for old entities to new modpack entities
|
||||
function mobs:alias_mob(old_name, new_name)
|
||||
function mcl_mobs:alias_mob(old_name, new_name)
|
||||
|
||||
-- spawn egg
|
||||
minetest.register_alias(old_name, new_name)
|
||||
|
@ -4374,7 +4486,7 @@ minetest.register_globalstep(function(dtime)
|
|||
local pos = player:get_pos()
|
||||
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 47)) do
|
||||
local lua = obj:get_luaentity()
|
||||
if lua and lua._cmi_is_mob then
|
||||
if lua and lua.is_mob then
|
||||
lua.lifetimer = math.max(20, lua.lifetimer)
|
||||
lua.despawn_immediately = false
|
||||
end
|
||||
|
|
|
@ -12,7 +12,7 @@ local crash_threshold = 6.5 -- ignored if enable_crash=false
|
|||
|
||||
local node_ok = function(pos, fallback)
|
||||
|
||||
fallback = fallback or mobs.fallback_node
|
||||
fallback = fallback or mcl_mobs.fallback_node
|
||||
|
||||
local node = minetest.get_node_or_nil(pos)
|
||||
|
||||
|
@ -119,7 +119,7 @@ end)
|
|||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
function mobs.attach(entity, player)
|
||||
function mcl_mobs.attach(entity, player)
|
||||
|
||||
local attach_at, eye_offset
|
||||
|
||||
|
@ -162,7 +162,7 @@ function mobs.attach(entity, player)
|
|||
end
|
||||
|
||||
|
||||
function mobs.detach(player, offset)
|
||||
function mcl_mobs.detach(player, offset)
|
||||
|
||||
force_detach(player)
|
||||
|
||||
|
@ -185,7 +185,7 @@ function mobs.detach(player, offset)
|
|||
end
|
||||
|
||||
|
||||
function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
||||
function mcl_mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
||||
|
||||
local rot_view = 0
|
||||
|
||||
|
@ -261,7 +261,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
|||
if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
|
||||
|
||||
if stand_anim then
|
||||
mobs:set_animation(entity, stand_anim)
|
||||
mcl_mobs:set_animation(entity, stand_anim)
|
||||
end
|
||||
|
||||
return
|
||||
|
@ -269,7 +269,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
|||
|
||||
-- set moving animation
|
||||
if moving_anim then
|
||||
mobs:set_animation(entity, moving_anim)
|
||||
mcl_mobs:set_animation(entity, moving_anim)
|
||||
end
|
||||
|
||||
-- Stop!
|
||||
|
@ -388,7 +388,7 @@ end
|
|||
|
||||
-- directional flying routine by D00Med (edited by TenPlus1)
|
||||
|
||||
function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim)
|
||||
function mcl_mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim)
|
||||
|
||||
local ctrl = entity.driver:get_player_control()
|
||||
local velo = entity.object:get_velocity()
|
||||
|
@ -440,9 +440,9 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim)
|
|||
-- change animation if stopped
|
||||
if velo.x == 0 and velo.y == 0 and velo.z == 0 then
|
||||
|
||||
mobs:set_animation(entity, stand_anim)
|
||||
mcl_mobs:set_animation(entity, stand_anim)
|
||||
else
|
||||
-- moving animation
|
||||
mobs:set_animation(entity, moving_anim)
|
||||
mcl_mobs:set_animation(entity, moving_anim)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,187 +1,211 @@
|
|||
--lua locals
|
||||
local get_node = minetest.get_node
|
||||
local get_item_group = minetest.get_item_group
|
||||
local get_node_light = minetest.get_node_light
|
||||
local get_node = minetest.get_node
|
||||
local get_item_group = minetest.get_item_group
|
||||
local get_node_light = minetest.get_node_light
|
||||
local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
|
||||
local new_vector = vector.new
|
||||
local get_biome_name = minetest.get_biome_name
|
||||
local get_objects_inside_radius = minetest.get_objects_inside_radius
|
||||
local get_connected_players = minetest.get_connected_players
|
||||
local minetest_get_perlin = minetest.get_perlin
|
||||
|
||||
local math_random = math.random
|
||||
local get_biome_name = minetest.get_biome_name
|
||||
local max = math.max
|
||||
local get_objects_inside_radius = minetest.get_objects_inside_radius
|
||||
local vector_distance = vector.distance
|
||||
local math_floor = math.floor
|
||||
local math_ceil = math.ceil
|
||||
local math_cos = math.cos
|
||||
local math_sin = math.sin
|
||||
local math_round = function(x) return (x > 0) and math_floor(x + 0.5) or math_ceil(x - 0.5) end
|
||||
|
||||
--local vector_distance = vector.distance
|
||||
local vector_new = vector.new
|
||||
local vector_floor = vector.floor
|
||||
|
||||
local table_copy = table.copy
|
||||
local table_remove = table.remove
|
||||
|
||||
local pairs = pairs
|
||||
|
||||
-- range for mob count
|
||||
local aoc_range = 32
|
||||
--[[
|
||||
|
||||
THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs
|
||||
|
||||
underground:
|
||||
"FlowerForest_underground",
|
||||
"JungleEdge_underground",local spawning_position = spawning_position_list[math.random(1,#spawning_position_list)]
|
||||
"ColdTaiga_underground",
|
||||
"IcePlains_underground",
|
||||
"IcePlainsSpikes_underground",
|
||||
"MegaTaiga_underground",
|
||||
"Taiga_underground",
|
||||
"ExtremeHills+_underground",
|
||||
"JungleM_underground",
|
||||
"ExtremeHillsM_underground",
|
||||
"JungleEdgeM_underground",
|
||||
|
||||
ocean:
|
||||
"RoofedForest_ocean",
|
||||
"JungleEdgeM_ocean",
|
||||
"BirchForestM_ocean",
|
||||
"BirchForest_ocean",
|
||||
"IcePlains_deep_ocean",
|
||||
"Jungle_deep_ocean",
|
||||
"Savanna_ocean",
|
||||
"MesaPlateauF_ocean",
|
||||
"ExtremeHillsM_deep_ocean",
|
||||
"Savanna_deep_ocean",
|
||||
"SunflowerPlains_ocean",
|
||||
"Swampland_deep_ocean",
|
||||
"Swampland_ocean",
|
||||
"MegaSpruceTaiga_deep_ocean",
|
||||
"ExtremeHillsM_ocean",
|
||||
"JungleEdgeM_deep_ocean",
|
||||
"SunflowerPlains_deep_ocean",
|
||||
"BirchForest_deep_ocean",
|
||||
"IcePlainsSpikes_ocean",
|
||||
"Mesa_ocean",
|
||||
"StoneBeach_ocean",
|
||||
"Plains_deep_ocean",
|
||||
"JungleEdge_deep_ocean",
|
||||
"SavannaM_deep_ocean",
|
||||
"Desert_deep_ocean",
|
||||
"Mesa_deep_ocean",
|
||||
"ColdTaiga_deep_ocean",
|
||||
"Plains_ocean",
|
||||
"MesaPlateauFM_ocean",
|
||||
"Forest_deep_ocean",
|
||||
"JungleM_deep_ocean",
|
||||
"FlowerForest_deep_ocean",
|
||||
"MushroomIsland_ocean",
|
||||
"MegaTaiga_ocean",
|
||||
"StoneBeach_deep_ocean",
|
||||
"IcePlainsSpikes_deep_ocean",
|
||||
"ColdTaiga_ocean",
|
||||
"SavannaM_ocean",
|
||||
"MesaPlateauF_deep_ocean",
|
||||
"MesaBryce_deep_ocean",
|
||||
"ExtremeHills+_deep_ocean",
|
||||
"ExtremeHills_ocean",
|
||||
"MushroomIsland_deep_ocean",
|
||||
"Forest_ocean",
|
||||
"MegaTaiga_deep_ocean",
|
||||
"JungleEdge_ocean",
|
||||
"MesaBryce_ocean",
|
||||
"MegaSpruceTaiga_ocean",
|
||||
"ExtremeHills+_ocean",
|
||||
"Jungle_ocean",
|
||||
"RoofedForest_deep_ocean",
|
||||
"IcePlains_ocean",
|
||||
"FlowerForest_ocean",
|
||||
"ExtremeHills_deep_ocean",
|
||||
"MesaPlateauFM_deep_ocean",
|
||||
"Desert_ocean",
|
||||
"Taiga_ocean",
|
||||
"BirchForestM_deep_ocean",
|
||||
"Taiga_deep_ocean",
|
||||
"JungleM_ocean",
|
||||
|
||||
water or beach?
|
||||
"MesaPlateauFM_sandlevel",
|
||||
"MesaPlateauF_sandlevel",
|
||||
"MesaBryce_sandlevel",
|
||||
"Mesa_sandlevel",
|
||||
|
||||
beach:
|
||||
"FlowerForest_beach",
|
||||
"Forest_beach",
|
||||
"StoneBeach",
|
||||
"ColdTaiga_beach_water",
|
||||
"Taiga_beach",
|
||||
"Savanna_beach",
|
||||
"Plains_beach",
|
||||
"ExtremeHills_beach",
|
||||
"ColdTaiga_beach",
|
||||
"Swampland_shore",
|
||||
"MushroomIslandShore",
|
||||
"JungleM_shore",
|
||||
"Jungle_shore",
|
||||
|
||||
dimension biome:
|
||||
"Nether",
|
||||
"End",
|
||||
|
||||
Overworld regular:
|
||||
"Mesa",
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"Jungle",
|
||||
"Savanna",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"Desert",
|
||||
"ColdTaiga",
|
||||
"MushroomIsland",
|
||||
"IcePlainsSpikes",
|
||||
"SunflowerPlains",
|
||||
"IcePlains",
|
||||
"RoofedForest",
|
||||
"ExtremeHills+_snowtop",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"JungleEdgeM",
|
||||
"ExtremeHillsM",
|
||||
"JungleM",
|
||||
"BirchForestM",
|
||||
"MesaPlateauF",
|
||||
"MesaPlateauFM",
|
||||
"MesaPlateauF_grasstop",
|
||||
"MesaBryce",
|
||||
"JungleEdge",
|
||||
"SavannaM",
|
||||
]]--
|
||||
|
||||
|
||||
|
||||
|
||||
--do mobs spawn?
|
||||
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
|
||||
-- count how many mobs of one type are inside an area
|
||||
|
||||
local count_mobs = function(pos,mobtype)
|
||||
|
||||
local noise_params = {
|
||||
offset = 0,
|
||||
scale = 3,
|
||||
spread = {
|
||||
x = 301,
|
||||
y = 50,
|
||||
z = 304,
|
||||
},
|
||||
seed = 100,
|
||||
octaves = 3,
|
||||
persistence = 0.5,
|
||||
}
|
||||
|
||||
-- THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs
|
||||
-- Also used for missing parameter
|
||||
-- Please update the list when adding new biomes!
|
||||
|
||||
local list_of_all_biomes = {
|
||||
|
||||
-- underground:
|
||||
|
||||
"FlowerForest_underground",
|
||||
"JungleEdge_underground",
|
||||
"ColdTaiga_underground",
|
||||
"IcePlains_underground",
|
||||
"IcePlainsSpikes_underground",
|
||||
"MegaTaiga_underground",
|
||||
"Taiga_underground",
|
||||
"ExtremeHills+_underground",
|
||||
"JungleM_underground",
|
||||
"ExtremeHillsM_underground",
|
||||
"JungleEdgeM_underground",
|
||||
|
||||
-- ocean:
|
||||
|
||||
"RoofedForest_ocean",
|
||||
"JungleEdgeM_ocean",
|
||||
"BirchForestM_ocean",
|
||||
"BirchForest_ocean",
|
||||
"IcePlains_deep_ocean",
|
||||
"Jungle_deep_ocean",
|
||||
"Savanna_ocean",
|
||||
"MesaPlateauF_ocean",
|
||||
"ExtremeHillsM_deep_ocean",
|
||||
"Savanna_deep_ocean",
|
||||
"SunflowerPlains_ocean",
|
||||
"Swampland_deep_ocean",
|
||||
"Swampland_ocean",
|
||||
"MegaSpruceTaiga_deep_ocean",
|
||||
"ExtremeHillsM_ocean",
|
||||
"JungleEdgeM_deep_ocean",
|
||||
"SunflowerPlains_deep_ocean",
|
||||
"BirchForest_deep_ocean",
|
||||
"IcePlainsSpikes_ocean",
|
||||
"Mesa_ocean",
|
||||
"StoneBeach_ocean",
|
||||
"Plains_deep_ocean",
|
||||
"JungleEdge_deep_ocean",
|
||||
"SavannaM_deep_ocean",
|
||||
"Desert_deep_ocean",
|
||||
"Mesa_deep_ocean",
|
||||
"ColdTaiga_deep_ocean",
|
||||
"Plains_ocean",
|
||||
"MesaPlateauFM_ocean",
|
||||
"Forest_deep_ocean",
|
||||
"JungleM_deep_ocean",
|
||||
"FlowerForest_deep_ocean",
|
||||
"MushroomIsland_ocean",
|
||||
"MegaTaiga_ocean",
|
||||
"StoneBeach_deep_ocean",
|
||||
"IcePlainsSpikes_deep_ocean",
|
||||
"ColdTaiga_ocean",
|
||||
"SavannaM_ocean",
|
||||
"MesaPlateauF_deep_ocean",
|
||||
"MesaBryce_deep_ocean",
|
||||
"ExtremeHills+_deep_ocean",
|
||||
"ExtremeHills_ocean",
|
||||
"MushroomIsland_deep_ocean",
|
||||
"Forest_ocean",
|
||||
"MegaTaiga_deep_ocean",
|
||||
"JungleEdge_ocean",
|
||||
"MesaBryce_ocean",
|
||||
"MegaSpruceTaiga_ocean",
|
||||
"ExtremeHills+_ocean",
|
||||
"Jungle_ocean",
|
||||
"RoofedForest_deep_ocean",
|
||||
"IcePlains_ocean",
|
||||
"FlowerForest_ocean",
|
||||
"ExtremeHills_deep_ocean",
|
||||
"MesaPlateauFM_deep_ocean",
|
||||
"Desert_ocean",
|
||||
"Taiga_ocean",
|
||||
"BirchForestM_deep_ocean",
|
||||
"Taiga_deep_ocean",
|
||||
"JungleM_ocean",
|
||||
|
||||
-- water or beach?
|
||||
|
||||
"MesaPlateauFM_sandlevel",
|
||||
"MesaPlateauF_sandlevel",
|
||||
"MesaBryce_sandlevel",
|
||||
"Mesa_sandlevel",
|
||||
|
||||
-- beach:
|
||||
|
||||
"FlowerForest_beach",
|
||||
"Forest_beach",
|
||||
"StoneBeach",
|
||||
"ColdTaiga_beach_water",
|
||||
"Taiga_beach",
|
||||
"Savanna_beach",
|
||||
"Plains_beach",
|
||||
"ExtremeHills_beach",
|
||||
"ColdTaiga_beach",
|
||||
"Swampland_shore",
|
||||
"MushroomIslandShore",
|
||||
"JungleM_shore",
|
||||
"Jungle_shore",
|
||||
|
||||
-- dimension biome:
|
||||
|
||||
"Nether",
|
||||
"End",
|
||||
|
||||
-- Overworld regular:
|
||||
|
||||
"Mesa",
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"Jungle",
|
||||
"Savanna",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"Desert",
|
||||
"ColdTaiga",
|
||||
"MushroomIsland",
|
||||
"IcePlainsSpikes",
|
||||
"SunflowerPlains",
|
||||
"IcePlains",
|
||||
"RoofedForest",
|
||||
"ExtremeHills+_snowtop",
|
||||
"MesaPlateauFM_grasstop",
|
||||
"JungleEdgeM",
|
||||
"ExtremeHillsM",
|
||||
"JungleM",
|
||||
"BirchForestM",
|
||||
"MesaPlateauF",
|
||||
"MesaPlateauFM",
|
||||
"MesaPlateauF_grasstop",
|
||||
"MesaBryce",
|
||||
"JungleEdge",
|
||||
"SavannaM",
|
||||
}
|
||||
|
||||
-- count how many mobs are in an area
|
||||
local function count_mobs(pos)
|
||||
local num = 0
|
||||
local objs = get_objects_inside_radius(pos, aoc_range)
|
||||
for n = 1, #objs do
|
||||
local obj = objs[n]:get_luaentity()
|
||||
if obj and obj.name and obj._cmi_is_mob then
|
||||
-- count hostile mobs only
|
||||
if mobtype == "hostile" then
|
||||
if obj.spawn_class == "hostile" then
|
||||
num = num + 1
|
||||
end
|
||||
-- count passive mobs only
|
||||
else
|
||||
num = num + 1
|
||||
end
|
||||
for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do
|
||||
if object and object:get_luaentity() and object:get_luaentity().is_mob then
|
||||
num = num + 1
|
||||
end
|
||||
end
|
||||
|
||||
return num
|
||||
end
|
||||
|
||||
|
||||
-- global functions
|
||||
|
||||
function mobs:spawn_abm_check(pos, node, name)
|
||||
function mcl_mobs:spawn_abm_check(pos, node, name)
|
||||
-- global function to add additional spawn checks
|
||||
-- return true to stop spawning mob
|
||||
end
|
||||
|
@ -215,10 +239,72 @@ WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua??
|
|||
|
||||
--this is where all of the spawning information is kept
|
||||
local spawn_dictionary = {}
|
||||
local summary_chance = 0
|
||||
|
||||
function 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:spawn_setup(def)
|
||||
if not mobs_spawn then return end
|
||||
|
||||
--print(dump(biomes))
|
||||
if not def then
|
||||
minetest.log("warning", "Empty mob spawn setup definition")
|
||||
return
|
||||
end
|
||||
|
||||
local name = def.name
|
||||
if not name then
|
||||
minetest.log("warning", "Missing mob name")
|
||||
return
|
||||
end
|
||||
|
||||
local dimension = def.dimension or "overworld"
|
||||
local type_of_spawning = def.type_of_spawning or "ground"
|
||||
local biomes = def.biomes or list_of_all_biomes
|
||||
local min_light = def.min_light or 0
|
||||
local max_light = def.max_light or (minetest.LIGHT_MAX + 1)
|
||||
local chance = def.chance or 1000
|
||||
local aoc = def.aoc or aoc_range
|
||||
local min_height = def.min_height or mcl_mapgen.overworld.min
|
||||
local max_height = def.max_height or mcl_mapgen.overworld.max
|
||||
local day_toggle = def.day_toggle
|
||||
local on_spawn = def.on_spawn
|
||||
local check_position = def.check_position
|
||||
|
||||
-- chance/spawn number override in minetest.conf for registered mob
|
||||
local numbers = minetest.settings:get(name)
|
||||
if numbers then
|
||||
numbers = numbers:split(",")
|
||||
chance = tonumber(numbers[1]) or chance
|
||||
aoc = tonumber(numbers[2]) or aoc
|
||||
if chance == 0 then
|
||||
minetest.log("warning", string.format("[mcl_mobs] %s has spawning disabled", name))
|
||||
return
|
||||
end
|
||||
minetest.log("action", string.format("[mcl_mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
||||
end
|
||||
|
||||
if chance < 1 then
|
||||
chance = 1
|
||||
minetest.log("warning", "Chance shouldn't be less than 1 (mob name: " .. name ..")")
|
||||
end
|
||||
|
||||
spawn_dictionary[#spawn_dictionary + 1] = {
|
||||
name = name,
|
||||
dimension = dimension,
|
||||
type_of_spawning = type_of_spawning,
|
||||
biomes = biomes,
|
||||
min_light = min_light,
|
||||
max_light = max_light,
|
||||
chance = chance,
|
||||
aoc = aoc,
|
||||
min_height = min_height,
|
||||
max_height = max_height,
|
||||
day_toggle = day_toggle,
|
||||
check_position = check_position,
|
||||
on_spawn = on_spawn,
|
||||
}
|
||||
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)
|
||||
|
||||
-- Do mobs spawn at all?
|
||||
if not mobs_spawn then
|
||||
|
@ -234,184 +320,11 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh
|
|||
aoc = tonumber(numbers[2]) or aoc
|
||||
|
||||
if chance == 0 then
|
||||
minetest.log("warning", string.format("[mobs] %s has spawning disabled", name))
|
||||
minetest.log("warning", string.format("[mcl_mobs] %s has spawning disabled", name))
|
||||
return
|
||||
end
|
||||
|
||||
minetest.log("action",
|
||||
string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
||||
end
|
||||
|
||||
--[[
|
||||
local spawn_action
|
||||
spawn_action = function(pos, node, active_object_count, active_object_count_wider, name)
|
||||
|
||||
local orig_pos = table.copy(pos)
|
||||
-- is mob actually registered?
|
||||
if not mobs.spawning_mobs[name]
|
||||
or not minetest.registered_entities[name] then
|
||||
minetest.log("warning", "Mob spawn of "..name.." failed, unknown entity or mob is not registered for spawning!")
|
||||
return
|
||||
end
|
||||
|
||||
-- additional custom checks for spawning mob
|
||||
if mobs:spawn_abm_check(pos, node, name) == true then
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, ABM check rejected!")
|
||||
return
|
||||
end
|
||||
|
||||
-- count nearby mobs in same spawn class
|
||||
local entdef = minetest.registered_entities[name]
|
||||
local spawn_class = entdef and entdef.spawn_class
|
||||
if not spawn_class then
|
||||
if entdef.type == "monster" then
|
||||
spawn_class = "hostile"
|
||||
else
|
||||
spawn_class = "passive"
|
||||
end
|
||||
end
|
||||
local in_class_cap = count_mobs(pos, "!"..spawn_class) < MOB_CAP[spawn_class]
|
||||
-- do not spawn if too many of same mob in area
|
||||
if active_object_count_wider >= max_per_block -- large-range mob cap
|
||||
or (not in_class_cap) -- spawn class mob cap
|
||||
or count_mobs(pos, name) >= aoc then -- per-mob mob cap
|
||||
-- too many entities
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too crowded!")
|
||||
return
|
||||
end
|
||||
|
||||
-- if toggle set to nil then ignore day/night check
|
||||
if day_toggle ~= nil then
|
||||
|
||||
local tod = (minetest.get_timeofday() or 0) * 24000
|
||||
|
||||
if tod > 4500 and tod < 19500 then
|
||||
-- daylight, but mob wants night
|
||||
if day_toggle == false then
|
||||
-- mob needs night
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs light!")
|
||||
return
|
||||
end
|
||||
else
|
||||
-- night time but mob wants day
|
||||
if day_toggle == true then
|
||||
-- mob needs day
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs daylight!")
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- spawn above node
|
||||
pos.y = pos.y + 1
|
||||
|
||||
-- only spawn away from player
|
||||
local objs = minetest.get_objects_inside_radius(pos, 24)
|
||||
|
||||
for n = 1, #objs do
|
||||
|
||||
if objs[n]:is_player() then
|
||||
-- player too close
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, player too close!")
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- mobs cannot spawn in protected areas when enabled
|
||||
if not spawn_protected
|
||||
and minetest.is_protected(pos, "") then
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, position is protected!")
|
||||
return
|
||||
end
|
||||
|
||||
-- are we spawning within height limits?
|
||||
if pos.y > max_height
|
||||
or pos.y < min_height then
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, out of height limit!")
|
||||
return
|
||||
end
|
||||
|
||||
-- are light levels ok?
|
||||
local light = minetest.get_node_light(pos)
|
||||
if not light
|
||||
or light > max_light
|
||||
or light < min_light then
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, bad light!")
|
||||
return
|
||||
end
|
||||
|
||||
-- do we have enough space to spawn mob?
|
||||
local ent = minetest.registered_entities[name]
|
||||
local width_x = max(1, math.ceil(ent.collisionbox[4] - ent.collisionbox[1]))
|
||||
local min_x, max_x
|
||||
if width_x % 2 == 0 then
|
||||
max_x = math.floor(width_x/2)
|
||||
min_x = -(max_x-1)
|
||||
else
|
||||
max_x = math.floor(width_x/2)
|
||||
min_x = -max_x
|
||||
end
|
||||
|
||||
local width_z = max(1, math.ceil(ent.collisionbox[6] - ent.collisionbox[3]))
|
||||
local min_z, max_z
|
||||
if width_z % 2 == 0 then
|
||||
max_z = math.floor(width_z/2)
|
||||
min_z = -(max_z-1)
|
||||
else
|
||||
max_z = math.floor(width_z/2)
|
||||
min_z = -max_z
|
||||
end
|
||||
|
||||
local max_y = max(0, math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1)
|
||||
|
||||
for y = 0, max_y do
|
||||
for x = min_x, max_x do
|
||||
for z = min_z, max_z do
|
||||
local pos2 = {x = pos.x+x, y = pos.y+y, z = pos.z+z}
|
||||
if minetest.registered_nodes[node_ok(pos2).name].walkable == true then
|
||||
-- inside block
|
||||
minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too little space!")
|
||||
if ent.spawn_small_alternative ~= nil and (not minetest.registered_nodes[node_ok(pos).name].walkable) then
|
||||
minetest.log("info", "Trying to spawn smaller alternative mob: "..ent.spawn_small_alternative)
|
||||
spawn_action(orig_pos, node, active_object_count, active_object_count_wider, ent.spawn_small_alternative)
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- tweak X/Y/Z spawn pos
|
||||
if width_x % 2 == 0 then
|
||||
pos.x = pos.x + 0.5
|
||||
end
|
||||
if width_z % 2 == 0 then
|
||||
pos.z = pos.z + 0.5
|
||||
end
|
||||
pos.y = pos.y - 0.5
|
||||
|
||||
local mob = minetest.add_entity(pos, name)
|
||||
minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos))
|
||||
|
||||
if on_spawn then
|
||||
|
||||
local ent = mob:get_luaentity()
|
||||
|
||||
on_spawn(ent, pos)
|
||||
end
|
||||
end
|
||||
|
||||
local function spawn_abm_action(pos, node, active_object_count, active_object_count_wider)
|
||||
spawn_action(pos, node, active_object_count, active_object_count_wider, name)
|
||||
end
|
||||
]]--
|
||||
|
||||
local entdef = minetest.registered_entities[name]
|
||||
local spawn_class
|
||||
if entdef.type == "monster" then
|
||||
spawn_class = "hostile"
|
||||
else
|
||||
spawn_class = "passive"
|
||||
minetest.log("action", string.format("[mcl_mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
|
||||
end
|
||||
|
||||
--load information into the spawn dictionary
|
||||
|
@ -423,106 +336,34 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh
|
|||
spawn_dictionary[key]["biomes"] = biomes
|
||||
spawn_dictionary[key]["min_light"] = min_light
|
||||
spawn_dictionary[key]["max_light"] = max_light
|
||||
spawn_dictionary[key]["interval"] = interval
|
||||
spawn_dictionary[key]["chance"] = chance
|
||||
spawn_dictionary[key]["aoc"] = aoc
|
||||
spawn_dictionary[key]["min_height"] = min_height
|
||||
spawn_dictionary[key]["max_height"] = max_height
|
||||
spawn_dictionary[key]["day_toggle"] = day_toggle
|
||||
--spawn_dictionary[key]["on_spawn"] = spawn_abm_action
|
||||
spawn_dictionary[key]["spawn_class"] = spawn_class
|
||||
|
||||
--[[
|
||||
minetest.register_abm({
|
||||
label = name .. " spawning",
|
||||
nodenames = nodes,
|
||||
neighbors = neighbors,
|
||||
interval = interval,
|
||||
chance = floor(max(1, chance * mobs_spawn_chance)),
|
||||
catch_up = false,
|
||||
action = spawn_abm_action,
|
||||
})
|
||||
]]--
|
||||
summary_chance = summary_chance + chance
|
||||
end
|
||||
|
||||
-- compatibility with older mob registration
|
||||
-- we're going to forget about this for now -j4i
|
||||
--[[
|
||||
function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle)
|
||||
|
||||
mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30,
|
||||
chance, active_object_count, -31000, max_height, day_toggle)
|
||||
local two_pi = 2 * math.pi
|
||||
local function get_next_mob_spawn_pos(pos)
|
||||
local distance = math_random(25, 32)
|
||||
local angle = math_random() * two_pi
|
||||
return {
|
||||
x = math_round(pos.x + distance * math_cos(angle)),
|
||||
y = pos.y,
|
||||
z = math_round(pos.z + distance * math_sin(angle))
|
||||
}
|
||||
end
|
||||
]]--
|
||||
|
||||
|
||||
--Don't disable this yet-j4i
|
||||
-- MarkBu's spawn function
|
||||
|
||||
function mobs:spawn(def)
|
||||
--does nothing for now
|
||||
--[[
|
||||
local name = def.name
|
||||
local nodes = def.nodes or {"group:soil", "group:stone"}
|
||||
local neighbors = def.neighbors or {"air"}
|
||||
local min_light = def.min_light or 0
|
||||
local max_light = def.max_light or 15
|
||||
local interval = def.interval or 30
|
||||
local chance = def.chance or 5000
|
||||
local active_object_count = def.active_object_count or 1
|
||||
local min_height = def.min_height or -31000
|
||||
local max_height = def.max_height or 31000
|
||||
local day_toggle = def.day_toggle
|
||||
local on_spawn = def.on_spawn
|
||||
|
||||
mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval,
|
||||
chance, active_object_count, min_height, max_height, day_toggle, on_spawn)
|
||||
]]--
|
||||
end
|
||||
|
||||
|
||||
|
||||
local axis
|
||||
--inner and outer part of square donut radius
|
||||
local inner = 1
|
||||
local outer = 65
|
||||
local int = {-1,1}
|
||||
local position_calculation = function(pos)
|
||||
|
||||
pos = vector.floor(pos)
|
||||
|
||||
--this is used to determine the axis buffer from the player
|
||||
axis = math.random(0,1)
|
||||
|
||||
--cast towards the direction
|
||||
if axis == 0 then --x
|
||||
pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
|
||||
pos.z = pos.z + math.random(-outer,outer)
|
||||
else --z
|
||||
pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
|
||||
pos.x = pos.x + math.random(-outer,outer)
|
||||
end
|
||||
return(pos)
|
||||
end
|
||||
|
||||
--[[
|
||||
local decypher_limits_dictionary = {
|
||||
["overworld"] = {mcl_vars.mg_overworld_min,mcl_vars.mg_overworld_max},
|
||||
["nether"] = {mcl_vars.mg_nether_min, mcl_vars.mg_nether_max},
|
||||
["end"] = {mcl_vars.mg_end_min, mcl_vars.mg_end_max}
|
||||
}
|
||||
]]--
|
||||
|
||||
local function decypher_limits(posy)
|
||||
--local min_max_table = decypher_limits_dictionary[dimension]
|
||||
--return min_max_table[1],min_max_table[2]
|
||||
posy = math.floor(posy)
|
||||
posy = math_floor(posy)
|
||||
return posy - 32, posy + 32
|
||||
end
|
||||
|
||||
--a simple helper function for mob_spawn
|
||||
local function biome_check(biome_list, biome_goal)
|
||||
for _,data in ipairs(biome_list) do
|
||||
for _, data in pairs(biome_list) do
|
||||
if data == biome_goal then
|
||||
return true
|
||||
end
|
||||
|
@ -531,125 +372,111 @@ local function biome_check(biome_list, biome_goal)
|
|||
return false
|
||||
end
|
||||
|
||||
|
||||
--todo mob limiting
|
||||
--MAIN LOOP
|
||||
local function is_farm_animal(n)
|
||||
return n == "mobs_mc:pig" or n == "mobs_mc:cow" or n == "mobs_mc:sheep" or n == "mobs_mc:chicken" or n == "mobs_mc:horse" or n == "mobs_mc:donkey"
|
||||
end
|
||||
|
||||
if mobs_spawn then
|
||||
|
||||
local perlin_noise
|
||||
|
||||
local function spawn_a_mob(pos, dimension, y_min, y_max)
|
||||
local dimension = dimension or mcl_worlds.pos_to_dimension(pos)
|
||||
local goal_pos = get_next_mob_spawn_pos(pos)
|
||||
local spawning_position_list = find_nodes_in_area_under_air(
|
||||
{x = goal_pos.x, y = y_min, z = goal_pos.z},
|
||||
{x = goal_pos.x, y = y_max, z = goal_pos.z},
|
||||
{"group:solid", "group:water", "group:lava"}
|
||||
)
|
||||
if #spawning_position_list <= 0 then return end
|
||||
local spawning_position = spawning_position_list[math_random(1, #spawning_position_list)]
|
||||
|
||||
--hard code mob limit in area to 5 for now
|
||||
if count_mobs(spawning_position) >= 5 then return end
|
||||
|
||||
local gotten_node = get_node(spawning_position).name
|
||||
local gotten_biome = minetest.get_biome_data(spawning_position)
|
||||
if not gotten_node or not gotten_biome then return end
|
||||
gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with
|
||||
|
||||
--add this so mobs don't spawn inside nodes
|
||||
spawning_position.y = spawning_position.y + 1
|
||||
|
||||
--only need to poll for node light if everything else worked
|
||||
local gotten_light = get_node_light(spawning_position)
|
||||
|
||||
local is_water = get_item_group(gotten_node, "water") ~= 0
|
||||
local is_lava = get_item_group(gotten_node, "lava") ~= 0
|
||||
local is_ground = not (is_water or is_lava)
|
||||
local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0
|
||||
local has_bed = minetest.find_node_near(pos,25,{"group:bed"})
|
||||
|
||||
if not is_ground then
|
||||
spawning_position.y = spawning_position.y - 1
|
||||
end
|
||||
|
||||
local mob_def
|
||||
|
||||
--create a disconnected clone of the spawn dictionary
|
||||
--prevents memory leak
|
||||
local mob_library_worker_table = table_copy(spawn_dictionary)
|
||||
|
||||
--grab mob that fits into the spawning location
|
||||
--randomly grab a mob, don't exclude any possibilities
|
||||
perlin_noise = perlin_noise or minetest_get_perlin(noise_params)
|
||||
local noise = perlin_noise:get_3d(spawning_position)
|
||||
local current_summary_chance = summary_chance
|
||||
while #mob_library_worker_table > 0 do
|
||||
local mob_chance_offset = (math_round(noise * current_summary_chance + 12345) % current_summary_chance) + 1
|
||||
local mob_index = 1
|
||||
local mob_chance = mob_library_worker_table[mob_index].chance
|
||||
local step_chance = mob_chance
|
||||
while step_chance < mob_chance_offset do
|
||||
mob_index = mob_index + 1
|
||||
mob_chance = mob_library_worker_table[mob_index].chance
|
||||
step_chance = step_chance + mob_chance
|
||||
end
|
||||
local mob_def = mob_library_worker_table[mob_index]
|
||||
local mob_type = minetest.registered_entities[mob_def.name].type
|
||||
if mob_def
|
||||
and spawning_position.y >= mob_def.min_height
|
||||
and spawning_position.y <= mob_def.max_height
|
||||
and mob_def.dimension == dimension
|
||||
and biome_check(mob_def.biomes, gotten_biome)
|
||||
and gotten_light >= mob_def.min_light
|
||||
and gotten_light <= mob_def.max_light
|
||||
and (is_ground or mob_def.type_of_spawning ~= "ground")
|
||||
and (mob_def.check_position and mob_def.check_position(spawning_position) or true)
|
||||
and (not is_farm_animal(mob_def.name) or is_grass)
|
||||
and (mob_type ~= "npc" or has_bed)
|
||||
then
|
||||
--everything is correct, spawn mob
|
||||
local object = minetest.add_entity(spawning_position, mob_def.name)
|
||||
if object then
|
||||
return mob_def.on_spawn and mob_def.on_spawn(object, pos)
|
||||
end
|
||||
end
|
||||
current_summary_chance = current_summary_chance - mob_chance
|
||||
table_remove(mob_library_worker_table, mob_index)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--MAIN LOOP
|
||||
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer >= 8 then
|
||||
timer = 0
|
||||
for _,player in pairs(minetest.get_connected_players()) do
|
||||
for i = 1,math_random(3,8) do
|
||||
repeat -- after this line each "break" means "continue"
|
||||
local player_pos = player:get_pos()
|
||||
|
||||
local _,dimension = mcl_worlds.y_to_layer(player_pos.y)
|
||||
|
||||
if dimension == "void" or dimension == "default" then
|
||||
break -- ignore void and unloaded area
|
||||
end
|
||||
|
||||
local min,max = decypher_limits(player_pos.y)
|
||||
|
||||
local goal_pos = position_calculation(player_pos)
|
||||
|
||||
local spawning_position_list = find_nodes_in_area_under_air(new_vector(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"})
|
||||
|
||||
--couldn't find node
|
||||
if #spawning_position_list <= 0 then
|
||||
break
|
||||
end
|
||||
|
||||
local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)]
|
||||
|
||||
--Prevent strange behavior/too close to player
|
||||
if not spawning_position or vector_distance(player_pos, spawning_position) < 15 then
|
||||
break
|
||||
end
|
||||
|
||||
local gotten_node = get_node(spawning_position)
|
||||
local gotten_node_name = gotten_node.name
|
||||
local gotten_node_def = minetest.registered_nodes[gotten_node_name]
|
||||
|
||||
if not gotten_node_name or not gotten_node_def or gotten_node_name == "air" then --skip air nodes
|
||||
break
|
||||
end
|
||||
|
||||
if gotten_node_def.use_texture_alpha and gotten_node_def.use_texture_alpha ~= "opaque" then
|
||||
break
|
||||
end --don't spawn on nonopaque nodes
|
||||
|
||||
local leaf = minetest.get_item_group(gotten_node_name,"leaves")
|
||||
if leaf ~= 0 then
|
||||
break end --don't spawn on treetops
|
||||
|
||||
local gotten_biome = minetest.get_biome_data(spawning_position)
|
||||
|
||||
if not gotten_biome then
|
||||
break --skip if in unloaded area
|
||||
end
|
||||
|
||||
gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with
|
||||
|
||||
--grab random mob
|
||||
local mob_def = spawn_dictionary[math.random(1,#spawn_dictionary)]
|
||||
|
||||
if not mob_def then
|
||||
break --skip if something ridiculous happens (nil mob def)
|
||||
end
|
||||
|
||||
--skip if not correct dimension
|
||||
if mob_def.dimension ~= dimension then
|
||||
break
|
||||
end
|
||||
|
||||
--skip if not in correct biome
|
||||
if not biome_check(mob_def.biomes, gotten_biome) then
|
||||
break
|
||||
end
|
||||
|
||||
--add this so mobs don't spawn inside nodes
|
||||
spawning_position.y = spawning_position.y + 1
|
||||
|
||||
if spawning_position.y < mob_def.min_height or spawning_position.y > mob_def.max_height then
|
||||
break
|
||||
end
|
||||
|
||||
--only need to poll for node light if everything else worked
|
||||
local gotten_light = get_node_light(spawning_position)
|
||||
|
||||
--don't spawn if not in light limits
|
||||
if gotten_light < mob_def.min_light or gotten_light > mob_def.max_light then
|
||||
break
|
||||
end
|
||||
|
||||
local is_water = get_item_group(gotten_node_name, "water") ~= 0
|
||||
local is_lava = get_item_group(gotten_node_name, "lava") ~= 0
|
||||
|
||||
if mob_def.type_of_spawning == "ground" and is_water then
|
||||
break
|
||||
end
|
||||
|
||||
if mob_def.type_of_spawning == "ground" and is_lava then
|
||||
break
|
||||
end
|
||||
|
||||
--finally do the heavy check (for now) of mobs in area
|
||||
if count_mobs(spawning_position, mob_def.spawn_class) >= mob_def.aoc then
|
||||
break
|
||||
end
|
||||
|
||||
--adjust the position for water and lava mobs
|
||||
if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then
|
||||
spawning_position.y = spawning_position.y - 1
|
||||
end
|
||||
|
||||
--everything is correct, spawn mob
|
||||
minetest.add_entity(spawning_position, mob_def.name)
|
||||
until true --this is a safety catch
|
||||
if timer < 10 then return end
|
||||
timer = 0
|
||||
for _, player in pairs(get_connected_players()) do
|
||||
local pos = player:get_pos()
|
||||
local dimension = mcl_worlds.pos_to_dimension(pos)
|
||||
-- ignore void and unloaded area
|
||||
if dimension ~= "void" and dimension ~= "default" then
|
||||
local y_min, y_max = decypher_limits(pos.y)
|
||||
for i = 1, math_random(1, 4) do
|
||||
spawn_a_mob(pos, dimension, y_min, y_max)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
local dim = {"x", "z"}
|
||||
|
||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
local function load_schem(filename)
|
||||
local file = io.open(modpath .. "/schems/" .. filename, "r")
|
||||
local data = minetest.deserialize(file:read())
|
||||
file:close()
|
||||
return data
|
||||
end
|
||||
|
||||
local wither_spawn_schems = {}
|
||||
|
||||
for _, d in pairs(dim) do
|
||||
wither_spawn_schems[d] = load_schem("wither_spawn_" .. d .. ".we")
|
||||
end
|
||||
|
||||
local function check_schem(pos, schem)
|
||||
for _, n in pairs(schem) do
|
||||
if minetest.get_node(vector.add(pos, n)).name ~= n.name then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
local function remove_schem(pos, schem)
|
||||
for _, n in pairs(schem) do
|
||||
minetest.remove_node(vector.add(pos, n))
|
||||
end
|
||||
end
|
||||
|
||||
local function wither_spawn(pos)
|
||||
for _, d in pairs(dim) do
|
||||
for i = 0, 2 do
|
||||
local p = vector.add(pos, {x = 0, y = -2, z = 0, [d] = -i})
|
||||
local schem = wither_spawn_schems[d]
|
||||
if check_schem(p, schem) then
|
||||
remove_schem(p, schem)
|
||||
minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local wither_head = minetest.registered_nodes["mcl_heads:wither_skeleton"]
|
||||
local old_on_place = wither_head.on_place
|
||||
function wither_head.on_place(itemstack, placer, pointed)
|
||||
minetest.after(0, wither_spawn, pointed.above)
|
||||
old_on_place(itemstack, placer, pointed)
|
||||
end
|
|
@ -0,0 +1,4 @@
|
|||
name = mcl_wither_spawning
|
||||
description = Wither Spawning for MineClone2
|
||||
author = Fleckenstein
|
||||
depends = mobs_mc, mcl_heads
|
|
@ -0,0 +1 @@
|
|||
return {{["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}}
|
|
@ -0,0 +1 @@
|
|||
return {{["y"] = 0, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 1}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 1}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 2}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 1, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 1, ["param2"] = 1, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 2, ["param2"] = 1, ["param1"] = 15}}
|
|
@ -1,333 +0,0 @@
|
|||
--[[ This table contains the concrete itemstrings to be used by this mod.
|
||||
All mobs in this mod must use variables in this table, instead
|
||||
of hardcoding the itemstring.
|
||||
This way, external mods are enabled to replace the itemstrings to provide
|
||||
their own items and game integration is made much simpler.
|
||||
|
||||
An item IDs is supposed to be overwritten by adding
|
||||
mobs_mc.override.items["example:item"] in a game mod
|
||||
with name "mobs_mc_gameconfig". ]]
|
||||
|
||||
|
||||
-- Standard items
|
||||
|
||||
-- If true, mobs_mc adds the monster egg nodes (needs default mod).
|
||||
-- Set to false in your gameconfig mod if you create your own monster egg nodes.
|
||||
mobs_mc.create_monster_egg_nodes = true
|
||||
|
||||
mobs_mc.items = {}
|
||||
|
||||
mobs_mc.items = {
|
||||
-- Items defined in mobs_mc
|
||||
blaze_rod = "mobs_mc:blaze_rod",
|
||||
blaze_powder = "mobs_mc:blaze_powder",
|
||||
chicken_raw = "mobs_mc:chicken_raw",
|
||||
chicken_cooked = "mobs_mc:chicken_cooked",
|
||||
feather = "mobs_mc:feather",
|
||||
beef_raw = "mobs_mc:beef_raw",
|
||||
beef_cooked = "mobs_mc:beef_cooked",
|
||||
bowl = "mobs_mc:bowl",
|
||||
mushroom_stew = "mobs_mc:mushroom_stew",
|
||||
milk = "mobs_mc:milk_bucket",
|
||||
dragon_egg = "mobs_mc:dragon_egg",
|
||||
egg = "mobs_mc:egg",
|
||||
ender_eye = "mobs_mc:ender_eye",
|
||||
ghast_tear = "mobs_mc:ghast_tear",
|
||||
saddle = "mobs:saddle",
|
||||
iron_horse_armor = "mobs_mc:iron_horse_armor",
|
||||
gold_horse_armor = "mobs_mc:gold_horse_armor",
|
||||
diamond_horse_armor = "mobs_mc:diamond_horse_armor",
|
||||
porkchop_raw = "mobs_mc:porkchop_raw",
|
||||
porkchop_cooked = "mobs_mc:porkchop_cooked",
|
||||
carrot_on_a_stick = "mobs_mc:carrot_on_a_stick",
|
||||
rabbit_raw = "mobs_mc:rabbit_raw",
|
||||
rabbit_cooked = "mobs_mc:rabbit_cooked",
|
||||
rabbit_hide = "mobs_mc:rabbit_hide",
|
||||
mutton_raw = "mobs_mc:mutton_raw",
|
||||
mutton_cooked = "mobs_mc:mutton_cooked",
|
||||
shulker_shell = "mobs_mc:shulker_shell",
|
||||
magma_cream = "mobs_mc:magma_cream",
|
||||
spider_eye = "mobs_mc:spider_eye",
|
||||
snowball = "mobs_mc:snowball",
|
||||
totem = "mobs_mc:totem",
|
||||
rotten_flesh = "mobs_mc:rotten_flesh",
|
||||
nether_star = "mobs_mc:nether_star",
|
||||
bone = "mobs_mc:bone",
|
||||
slimeball = "mobs_mc:slimeball",
|
||||
arrow = "mobs_mc:arrow",
|
||||
bow = "mobs_mc:bow_wood",
|
||||
head_creeper = "mobs_mc:head_creeper",
|
||||
head_zombie = "mobs_mc:head_zombie",
|
||||
head_skeleton = "mobs_mc:head_skeleton",
|
||||
head_wither_skeleton = "mobs_mc:head_wither_skeleton",
|
||||
|
||||
-- External items
|
||||
-- Mobs Redo
|
||||
leather = "mobs:leather",
|
||||
shears = "mobs:shears",
|
||||
|
||||
-- Minetest Game
|
||||
top_snow = "default:snow",
|
||||
snow_block = "default:snowblock",
|
||||
mushroom_red = "flowers:mushroom_red",
|
||||
bucket = "bucket:bucket_empty",
|
||||
grass_block = "default:dirt_with_grass",
|
||||
string = "farming:string",
|
||||
stick = "default:stick",
|
||||
flint = "default:flint",
|
||||
iron_ingot = "default:steel_ingot",
|
||||
iron_block = "default:steelblock",
|
||||
fire = "fire:basic_flame",
|
||||
gunpowder = "tnt:gunpowder",
|
||||
flint_and_steel = "fire:flint_and_steel",
|
||||
water_source = "default:water_source",
|
||||
river_water_source = "default:river_water_source",
|
||||
black_dye = "dye:black",
|
||||
poppy = "flowers:rose",
|
||||
dandelion = "flowers:dandelion_yellow",
|
||||
coal = "default:coal_lump",
|
||||
emerald = "default:diamond",
|
||||
iron_axe = "default:axe_steel",
|
||||
gold_sword = "default:sword_mese",
|
||||
gold_ingot = "default:gold_ingot",
|
||||
gold_nugget = "default:gold_lump",
|
||||
glowstone_dust = "default:mese_crystal_fragment",
|
||||
redstone = "default:mese_crystal_fragment",
|
||||
glass_bottle = "vessels:glass_bottle",
|
||||
sugar = "default:papyrus",
|
||||
wheat = "farming:wheat",
|
||||
hay_bale = "farming:straw",
|
||||
prismarine_shard = "default:mese_crystal_fragment",
|
||||
prismarine_crystals = "default:mese_crystal",
|
||||
apple = "default:apple",
|
||||
golden_apple = "default:apple",
|
||||
rabbit_foot = "mobs_mc:rabbit_foot",
|
||||
|
||||
-- Boss items
|
||||
wet_sponge = "default:gold_block", -- only dropped by elder guardian; there is no equivalent block in Minetest Game
|
||||
|
||||
-- Other
|
||||
nether_brick_block = "nether:brick",
|
||||
mycelium = "ethereal:mushroom_dirt",
|
||||
carrot = "farming:carrot",
|
||||
potato = "farming:potato",
|
||||
golden_carrot = "farming:carrot_gold",
|
||||
fishing_rod = "fishing:pole_wood",
|
||||
fish_raw = "fishing:fish_raw",
|
||||
salmon_raw = "fishing:carp_raw",
|
||||
clownfish_raw = "fishing:clownfish_raw",
|
||||
pufferfish_raw = "fishing:pike_raw",
|
||||
|
||||
cookie = "farming:cookie",
|
||||
|
||||
|
||||
-- TODO: Add actual ender pearl
|
||||
ender_pearl = "farorb:farorb",
|
||||
|
||||
nether_portal = "nether:portal",
|
||||
netherrack = "nether:rack",
|
||||
nether_brick_block = "nether:brick",
|
||||
|
||||
-- Wool (Minecraft color scheme)
|
||||
wool_white = "wool:white",
|
||||
wool_light_grey = "wool:grey",
|
||||
wool_grey = "wool:dark_grey",
|
||||
wool_blue = "wool:blue",
|
||||
wool_lime = "wool:green",
|
||||
wool_green = "wool:dark_green",
|
||||
wool_purple = "wool:violet",
|
||||
wool_pink = "wool:pink",
|
||||
wool_yellow = "wool:yellow",
|
||||
wool_orange = "wool:orange",
|
||||
wool_brown = "wool:brown",
|
||||
wool_red = "wool:red",
|
||||
wool_cyan = "wool:cyan",
|
||||
wool_magenta = "wool:magenta",
|
||||
wool_black = "wool:black",
|
||||
-- Light blue intentionally missing
|
||||
|
||||
-- Special items
|
||||
music_discs = {}, -- No music discs by default; used by creeper. Override this if your game has music discs.
|
||||
}
|
||||
|
||||
-- Tables for attracting, feeding and breeding mobs
|
||||
mobs_mc.follow = {
|
||||
sheep = { mobs_mc.items.wheat },
|
||||
cow = { mobs_mc.items.wheat },
|
||||
chicken = { "farming:seed_wheat", "farming:seed_cotton" }, -- seeds in general
|
||||
parrot = { "farming:seed_wheat", "farming:seed_cotton" }, -- seeds in general
|
||||
horse = { mobs_mc.items.apple, mobs_mc.items.sugar, mobs_mc.items.wheat, mobs_mc.items.hay_bale, mobs_mc.items.golden_apple, mobs_mc.items.golden_carrot },
|
||||
llama = { mobs_mc.items.wheat, mobs_mc.items.hay_bale, },
|
||||
pig = { mobs_mc.items.potato, mobs_mc.items.carrot, mobs_mc.items.carrot_on_a_stick,
|
||||
mobs_mc.items.apple, -- Minetest Game extra
|
||||
},
|
||||
rabbit = { mobs_mc.items.dandelion, mobs_mc.items.carrot, mobs_mc.items.golden_carrot, "farming_plus:carrot_item", },
|
||||
ocelot = { mobs_mc.items.fish_raw, mobs_mc.items.salmon_raw, mobs_mc.items.clownfish_raw, mobs_mc.items.pufferfish_raw,
|
||||
mobs_mc.items.chicken_raw, -- Minetest Game extra
|
||||
},
|
||||
wolf = { mobs_mc.items.bone },
|
||||
dog = { mobs_mc.items.rabbit_raw, mobs_mc.items.rabbit_cooked, mobs_mc.items.mutton_raw, mobs_mc.items.mutton_cooked, mobs_mc.items.beef_raw, mobs_mc.items.beef_cooked, mobs_mc.items.chicken_raw, mobs_mc.items.chicken_cooked, mobs_mc.items.rotten_flesh,
|
||||
-- Mobs Redo items
|
||||
"mobs:meat", "mobs:meat_raw" },
|
||||
}
|
||||
|
||||
-- Contents for replace_what
|
||||
mobs_mc.replace = {
|
||||
-- Rabbits reduce carrot growth stage by 1
|
||||
rabbit = {
|
||||
-- Farming Redo carrots
|
||||
{"farming:carrot_8", "farming:carrot_7", 0},
|
||||
{"farming:carrot_7", "farming:carrot_6", 0},
|
||||
{"farming:carrot_6", "farming:carrot_5", 0},
|
||||
{"farming:carrot_5", "farming:carrot_4", 0},
|
||||
{"farming:carrot_4", "farming:carrot_3", 0},
|
||||
{"farming:carrot_3", "farming:carrot_2", 0},
|
||||
{"farming:carrot_2", "farming:carrot_1", 0},
|
||||
{"farming:carrot_1", "air", 0},
|
||||
-- Farming Plus carrots
|
||||
{"farming_plus:carrot", "farming_plus:carrot_7", 0},
|
||||
{"farming_plus:carrot_6", "farming_plus:carrot_5", 0},
|
||||
{"farming_plus:carrot_5", "farming_plus:carrot_4", 0},
|
||||
{"farming_plus:carrot_4", "farming_plus:carrot_3", 0},
|
||||
{"farming_plus:carrot_3", "farming_plus:carrot_2", 0},
|
||||
{"farming_plus:carrot_2", "farming_plus:carrot_1", 0},
|
||||
{"farming_plus:carrot_1", "air", 0},
|
||||
},
|
||||
-- Sheep eat grass
|
||||
sheep = {
|
||||
-- Grass Block
|
||||
{ "default:dirt_with_grass", "default:dirt", -1 },
|
||||
-- “Tall Grass”
|
||||
{ "default:grass_5", "air", 0 },
|
||||
{ "default:grass_4", "air", 0 },
|
||||
{ "default:grass_3", "air", 0 },
|
||||
{ "default:grass_2", "air", 0 },
|
||||
{ "default:grass_1", "air", 0 },
|
||||
},
|
||||
-- Silverfish populate stone, etc. with monster eggs
|
||||
silverfish = {
|
||||
{"default:stone", "mobs_mc:monster_egg_stone", -1},
|
||||
{"default:cobble", "mobs_mc:monster_egg_cobble", -1},
|
||||
{"default:mossycobble", "mobs_mc:monster_egg_mossycobble", -1},
|
||||
{"default:stonebrick", "mobs_mc:monster_egg_stonebrick", -1},
|
||||
{"default:stone_block", "mobs_mc:monster_egg_stone_block", -1},
|
||||
},
|
||||
}
|
||||
|
||||
-- List of nodes which endermen can take
|
||||
mobs_mc.enderman_takable = {
|
||||
-- Generic handling, useful for entensions
|
||||
"group:enderman_takable",
|
||||
|
||||
-- Generic nodes
|
||||
"group:sand",
|
||||
"group:flower",
|
||||
|
||||
-- Minetest Game
|
||||
"default:dirt",
|
||||
"default:dirt_with_grass",
|
||||
"default:dirt_with_dry_grass",
|
||||
"default:dirt_with_snow",
|
||||
"default:dirt_with_rainforest_litter",
|
||||
"default:dirt_with_grass_footsteps",
|
||||
-- FIXME: For some reason, Minetest has a Lua error when an enderman tries to place a Minetest Game cactus.
|
||||
-- Maybe this is because default:cactus has rotate_and_place?
|
||||
-- "default:cactus", -- TODO: Re-enable cactus when it works again
|
||||
"default:gravel",
|
||||
"default:clay",
|
||||
"flowers:mushroom_red",
|
||||
"flowers:mushroom_brown",
|
||||
"tnt:tnt",
|
||||
|
||||
-- Nether mod
|
||||
"nether:rack",
|
||||
}
|
||||
|
||||
--[[ Table of nodes to replace when an enderman takes it.
|
||||
If the enderman takes an indexed node, it the enderman will get the item in the value.
|
||||
Table indexes: Original node, taken by enderman.
|
||||
Table values: The item which the enderman *actually* gets
|
||||
Example:
|
||||
mobs_mc.enderman_node_replace = {
|
||||
["default:dirt_with_dry_grass"] = "default_dirt_with_grass",
|
||||
}
|
||||
-- This means, if the enderman takes a dirt with dry grass, he will get a dirt with grass
|
||||
-- on his hand instead.
|
||||
]]
|
||||
mobs_mc.enderman_replace_on_take = {} -- no replacements by default
|
||||
|
||||
-- A table which can be used to override block textures of blocks carried by endermen.
|
||||
-- Only works for cube-shaped nodes and nodeboxes.
|
||||
-- Key: itemstrings of the blocks to replace
|
||||
-- Value: A table with the texture overrides (6 textures)
|
||||
mobs_mc.enderman_block_texture_overrides = {
|
||||
}
|
||||
|
||||
-- List of nodes on which mobs can spawn
|
||||
mobs_mc.spawn = {
|
||||
solid = { "group:cracky", "group:crumbly", "group:shovely", "group:pickaxey" }, -- spawn on "solid" nodes (this is mostly just guessing)
|
||||
|
||||
grassland = { mobs_mc.items.grass_block, "ethereal:prairie_dirt" },
|
||||
savanna = { "default:dirt_with_dry_grass" },
|
||||
grassland_savanna = { mobs_mc.items.grass_block, "default:dirt_with_dry_grass" },
|
||||
desert = { "default:desert_sand", "group:sand" },
|
||||
jungle = { "default:dirt_with_rainforest_litter", "default:jungleleaves", "default:junglewood", "mcl_core:jungleleaves", "mcl_core:junglewood" },
|
||||
snow = { "default:snow", "default:snowblock", "default:dirt_with_snow" },
|
||||
end_city = { "default:sandstonebrick", "mcl_end:purpur_block", "mcl_end:end_stone" },
|
||||
wolf = { mobs_mc.items.grass_block, "default:dirt_with_rainforest_litter", "default:dirt", "default:dirt_with_snow", "default:snow", "default:snowblock" },
|
||||
village = { "mg_villages:road" },
|
||||
|
||||
-- These probably don't need overrides
|
||||
mushroom_island = { mobs_mc.items.mycelium, "mcl_core:mycelium" },
|
||||
nether_fortress = { mobs_mc.items.nether_brick_block, "mcl_nether:nether_brick", },
|
||||
nether = { mobs_mc.items.netherrack, "mcl_nether:netherrack", },
|
||||
nether_portal = { mobs_mc.items.nether_portal, "mcl_portals:portal" },
|
||||
water = { mobs_mc.items.water_source, "mcl_core:water_source", "default:water_source" },
|
||||
}
|
||||
|
||||
-- This table contains important spawn height references for the mob spawn height.
|
||||
-- Please base your mob spawn height on these numbers to keep things clean.
|
||||
mobs_mc.spawn_height = {
|
||||
water = tonumber(minetest.settings:get("water_level")) or 0, -- Water level in the Overworld
|
||||
|
||||
-- Overworld boundaries (inclusive) --I adjusted this to be more reasonable
|
||||
overworld_min = -64,-- -2999,
|
||||
overworld_max = 31000,
|
||||
|
||||
-- Nether boundaries (inclusive)
|
||||
nether_min = -29067,-- -3369,
|
||||
nether_max = -28939,-- -3000,
|
||||
|
||||
-- End boundaries (inclusive)
|
||||
end_min = -6200,
|
||||
end_max = -6000,
|
||||
}
|
||||
|
||||
mobs_mc.misc = {
|
||||
shears_wear = 276, -- Wear to add per shears usage (238 uses)
|
||||
totem_fail_nodes = {} -- List of nodes in which the totem of undying fails
|
||||
}
|
||||
|
||||
-- Item name overrides from mobs_mc_gameconfig (if present)
|
||||
if minetest.get_modpath("mobs_mc_gameconfig") and mobs_mc.override then
|
||||
local tables = {"items", "follow", "replace", "spawn", "spawn_height", "misc"}
|
||||
for t=1, #tables do
|
||||
local tbl = tables[t]
|
||||
if mobs_mc.override[tbl] then
|
||||
for k, v in pairs(mobs_mc.override[tbl]) do
|
||||
mobs_mc[tbl][k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if mobs_mc.override.enderman_takable then
|
||||
mobs_mc.enderman_takable = mobs_mc.override.enderman_takable
|
||||
end
|
||||
if mobs_mc.override.enderman_replace_on_take then
|
||||
mobs_mc.enderman_replace_on_take = mobs_mc.override.enderman_replace_on_take
|
||||
end
|
||||
if mobs_mc.enderman_block_texture_overrides then
|
||||
mobs_mc.enderman_block_texture_overrides = mobs_mc.override.enderman_block_texture_overrides
|
||||
end
|
||||
end
|
||||
|
|
@ -1,587 +0,0 @@
|
|||
--MCmobs v0.5
|
||||
--maikerumine
|
||||
--made for MC like Survival game
|
||||
--License for code WTFPL and otherwise stated in readmes
|
||||
|
||||
--THIS IS THE MASTER ITEM LIST TO USE WITH DEFAULT
|
||||
|
||||
-- NOTE: Most strings intentionally not marked for translation, other mods already have these items.
|
||||
-- TODO: Remove this file eventually, most items are already outsourced in other mods.
|
||||
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local c = mobs_mc.is_item_variable_overridden
|
||||
|
||||
-- Blaze
|
||||
if c("blaze_rod") then
|
||||
minetest.register_craftitem("mobs_mc:blaze_rod", {
|
||||
description = "Blaze Rod",
|
||||
_doc_items_longdesc = "This is a crafting component dropped from dead blazes.",
|
||||
wield_image = "mcl_mobitems_blaze_rod.png",
|
||||
inventory_image = "mcl_mobitems_blaze_rod.png",
|
||||
})
|
||||
|
||||
-- Make blaze rod furnace-burnable. 1.5 times the burn time of a coal lump
|
||||
local coalcraft, burntime
|
||||
if minetest.get_modpath("default") then
|
||||
coalcraft = minetest.get_craft_result({method="fuel", width=1, items={"default:coal_lump"}})
|
||||
end
|
||||
if coalcraft then
|
||||
burntime = math.floor(coalcraft.time * 1.5)
|
||||
end
|
||||
if burntime == nil or burntime == 0 then
|
||||
burntime = 60
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
burntime = burntime,
|
||||
recipe = "mobs_mc:blaze_rod",
|
||||
})
|
||||
end
|
||||
|
||||
if c("blaze_powder") then
|
||||
minetest.register_craftitem("mobs_mc:blaze_powder", {
|
||||
description = "Blaze Powder",
|
||||
_doc_items_longdesc = "This item is mainly used for brewing potions and crafting.",
|
||||
wield_image = "mcl_mobitems_blaze_powder.png",
|
||||
inventory_image = "mcl_mobitems_blaze_powder.png",
|
||||
})
|
||||
end
|
||||
|
||||
if c("blaze_rod") and c("blaze_powder") then
|
||||
minetest.register_craft({
|
||||
output = "mobs_mc:blaze_powder 2",
|
||||
recipe = {{ "mobs_mc:blaze_rod" }},
|
||||
})
|
||||
end
|
||||
|
||||
-- Chicken
|
||||
if c("chicken_raw") then
|
||||
minetest.register_craftitem("mobs_mc:chicken_raw", {
|
||||
description = "Raw Chicken",
|
||||
_doc_items_longdesc = "Raw chicken is a food item and can be eaten safely. Cooking it will increase its nutritional value.",
|
||||
inventory_image = "mcl_mobitems_chicken_raw.png",
|
||||
groups = { food = 2, eatable = 2 },
|
||||
on_use = minetest.item_eat(2),
|
||||
})
|
||||
end
|
||||
|
||||
if c("chicken_cooked") then
|
||||
minetest.register_craftitem("mobs_mc:chicken_cooked", {
|
||||
description = "Cooked Chicken",
|
||||
_doc_items_longdesc = "A cooked chicken is a healthy food item which can be eaten.",
|
||||
inventory_image = "mcl_mobitems_chicken_cooked.png",
|
||||
groups = { food = 2, eatable = 6 },
|
||||
on_use = minetest.item_eat(6),
|
||||
})
|
||||
end
|
||||
|
||||
if c("chicken_raw") and c("chicken_cooked") then
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "mobs_mc:chicken_cooked",
|
||||
recipe = "mobs_mc:chicken_raw",
|
||||
cooktime = 5,
|
||||
})
|
||||
end
|
||||
|
||||
if c("feather") then
|
||||
minetest.register_craftitem("mobs_mc:feather", {
|
||||
description = "Feather",
|
||||
_doc_items_longdesc = "Feathers are used in crafting and are dropped from chickens.",
|
||||
inventory_image = "mcl_mobitems_feather.png",
|
||||
})
|
||||
end
|
||||
|
||||
-- Cow and mooshroom
|
||||
if c("beef_raw") then
|
||||
minetest.register_craftitem("mobs_mc:beef_raw", {
|
||||
description = "Raw Beef",
|
||||
_doc_items_longdesc = "Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.",
|
||||
inventory_image = "mcl_mobitems_beef_raw.png",
|
||||
groups = { food = 2, eatable = 3 },
|
||||
on_use = minetest.item_eat(3),
|
||||
})
|
||||
end
|
||||
|
||||
if c("beef_cooked") then
|
||||
minetest.register_craftitem("mobs_mc:beef_cooked", {
|
||||
description = "Steak",
|
||||
_doc_items_longdesc = "Steak is cooked beef from cows and can be eaten.",
|
||||
inventory_image = "mcl_mobitems_beef_cooked.png",
|
||||
groups = { food = 2, eatable = 8 },
|
||||
on_use = minetest.item_eat(8),
|
||||
})
|
||||
end
|
||||
|
||||
if c("beef_raw") and c("beef_cooked") then
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "mobs_mc:beef_cooked",
|
||||
recipe = "mobs_mc:beef_raw",
|
||||
cooktime = 5,
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
if c("milk") then
|
||||
-- milk
|
||||
minetest.register_craftitem("mobs_mc:milk_bucket", {
|
||||
description = "Milk",
|
||||
_doc_items_longdesc = "Milk is a food item obtained by using a bucket on a cow.",
|
||||
inventory_image = "mobs_bucket_milk.png",
|
||||
groups = { food = 3, eatable = 1 },
|
||||
on_use = minetest.item_eat(1, "bucket:bucket_empty"),
|
||||
stack_max = 1,
|
||||
})
|
||||
end
|
||||
|
||||
if c("bowl") then
|
||||
minetest.register_craftitem("mobs_mc:bowl", {
|
||||
description = "Bowl",
|
||||
_doc_items_longdesc = "Bowls are mainly used to hold tasty soups.",
|
||||
inventory_image = "mcl_core_bowl.png",
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mobs_mc:bowl",
|
||||
recipe = {
|
||||
{ "group:wood", "", "group:wood" },
|
||||
{ "", "group:wood", "", },
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = "mobs_mc:bowl",
|
||||
burntime = 5,
|
||||
})
|
||||
end
|
||||
|
||||
if c("mushroom_stew") then
|
||||
minetest.register_craftitem("mobs_mc:mushroom_stew", {
|
||||
description = "Mushroom Stew",
|
||||
_doc_items_longdesc = "Mushroom stew is a healthy soup.",
|
||||
inventory_image = "farming_mushroom_stew.png",
|
||||
groups = { food = 3, eatable = 6 },
|
||||
on_use = minetest.item_eat(6, "mobs_mc:bowl"),
|
||||
stack_max = 1,
|
||||
})
|
||||
end
|
||||
|
||||
-- Ender dragon
|
||||
if c("dragon_egg") then
|
||||
|
||||
local dragon_egg_sounds
|
||||
if minetest.get_modpath("default") then
|
||||
dragon_egg_sounds = default.node_sound_stone_defaults()
|
||||
end
|
||||
|
||||
--ender dragon
|
||||
minetest.register_node("mobs_mc:dragon_egg", {
|
||||
description = "Dragon Egg",
|
||||
tiles = {
|
||||
"mcl_end_dragon_egg.png",
|
||||
"mcl_end_dragon_egg.png",
|
||||
"mcl_end_dragon_egg.png",
|
||||
"mcl_end_dragon_egg.png",
|
||||
"mcl_end_dragon_egg.png",
|
||||
"mcl_end_dragon_egg.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
light_source = 1,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.375, -0.5, -0.375, 0.375, -0.4375, 0.375},
|
||||
{-0.5, -0.4375, -0.5, 0.5, -0.1875, 0.5},
|
||||
{-0.4375, -0.1875, -0.4375, 0.4375, 0, 0.4375},
|
||||
{-0.375, 0, -0.375, 0.375, 0.125, 0.375},
|
||||
{-0.3125, 0.125, -0.3125, 0.3125, 0.25, 0.3125},
|
||||
{-0.25, 0.25, -0.25, 0.25, 0.3125, 0.25},
|
||||
{-0.1875, 0.3125, -0.1875, 0.1875, 0.375, 0.1875},
|
||||
{-0.125, 0.375, -0.125, 0.125, 0.4375, 0.125},
|
||||
{-0.0625, 0.4375, -0.0625, 0.0625, 0.5, 0.0625},
|
||||
}
|
||||
},
|
||||
selection_box = {
|
||||
type = "regular",
|
||||
},
|
||||
groups = {snappy = 1, falling_node = 1, deco_block = 1, not_in_creative_inventory = 1, dig_by_piston = 1 },
|
||||
sounds = dragon_egg_sounds,
|
||||
-- TODO: Make dragon egg teleport on punching
|
||||
})
|
||||
end
|
||||
|
||||
local longdesc_craftitem
|
||||
if minetest.get_modpath("doc_items") then
|
||||
longdesc_craftitem = doc.sub.items.temp.craftitem
|
||||
end
|
||||
|
||||
-- Enderman
|
||||
if c("ender_eye") then
|
||||
minetest.register_craftitem("mobs_mc:ender_eye", {
|
||||
description = "Eye of Ender",
|
||||
_doc_items_longdesc = longdesc_craftitem,
|
||||
inventory_image = "mcl_end_ender_eye.png",
|
||||
groups = { craftitem = 1 },
|
||||
})
|
||||
end
|
||||
|
||||
if c("ender_eye") and c("blaze_powder") and c("blaze_rod") then
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "mobs_mc:ender_eye",
|
||||
recipe = { "mobs_mc:blaze_powder", "mobs_mc:blaze_rod"},
|
||||
})
|
||||
end
|
||||
|
||||
-- Ghast
|
||||
if c("ghast_tear") then
|
||||
minetest.register_craftitem("mobs_mc:ghast_tear", {
|
||||
description = "Ghast Tear",
|
||||
_doc_items_longdesc = "A ghast tear is an item used in potion brewing. It is dropped from dead ghasts.",
|
||||
wield_image = "mcl_mobitems_ghast_tear.png",
|
||||
inventory_image = "mcl_mobitems_ghast_tear.png",
|
||||
groups = { brewitem = 1 },
|
||||
})
|
||||
end
|
||||
|
||||
-- Saddle
|
||||
if c("saddle") then
|
||||
-- Overwrite the saddle from Mobs Redo
|
||||
minetest.register_craftitem(":mobs:saddle", {
|
||||
description = "Saddle",
|
||||
_doc_items_longdesc = "Saddles can be put on horses, donkeys, mules and pigs in order to mount them.",
|
||||
_doc_items_usagehelp = "Rightclick an animal while holding a saddle to put on the saddle. You can now mount the animal by rightclicking it again.",
|
||||
inventory_image = "mcl_mobitems_saddle.png",
|
||||
stack_max = 1,
|
||||
})
|
||||
end
|
||||
|
||||
-- Horse Armor
|
||||
local horse_armor_use = S("Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.")
|
||||
-- TODO: Balance the horse armor strength, compare with MC armor strength
|
||||
if c("iron_horse_armor") then
|
||||
minetest.register_craftitem("mobs_mc:iron_horse_armor", {
|
||||
description = S("Iron Horse Armor"),
|
||||
_doc_items_longdesc = S("Iron horse armor can be worn by horses to increase their protection from harm a bit."),
|
||||
_doc_items_usagehelp = horse_armor_use,
|
||||
inventory_image = "mobs_mc_iron_horse_armor.png",
|
||||
_horse_overlay_image = "mobs_mc_horse_armor_iron.png",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_iron",
|
||||
},
|
||||
stack_max = 1,
|
||||
groups = { horse_armor = 85 },
|
||||
})
|
||||
end
|
||||
if c("gold_horse_armor") then
|
||||
minetest.register_craftitem("mobs_mc:gold_horse_armor", {
|
||||
description = S("Golden Horse Armor"),
|
||||
_doc_items_longdesc = S("Golden horse armor can be worn by horses to increase their protection from harm."),
|
||||
_doc_items_usagehelp = horse_armor_use,
|
||||
inventory_image = "mobs_mc_gold_horse_armor.png",
|
||||
_horse_overlay_image = "mobs_mc_horse_armor_gold.png",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_iron",
|
||||
},
|
||||
stack_max = 1,
|
||||
groups = { horse_armor = 60 },
|
||||
})
|
||||
end
|
||||
if c("diamond_horse_armor") then
|
||||
minetest.register_craftitem("mobs_mc:diamond_horse_armor", {
|
||||
description = S("Diamond Horse Armor"),
|
||||
_doc_items_longdesc = S("Diamond horse armor can be worn by horses to greatly increase their protection from harm."),
|
||||
_doc_items_usagehelp = horse_armor_use,
|
||||
inventory_image = "mobs_mc_diamond_horse_armor.png",
|
||||
_horse_overlay_image = "mobs_mc_horse_armor_diamond.png",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_diamond",
|
||||
},
|
||||
stack_max = 1,
|
||||
groups = { horse_armor = 45 },
|
||||
})
|
||||
end
|
||||
|
||||
-- Pig
|
||||
if c("porkchop_raw") then
|
||||
minetest.register_craftitem("mobs_mc:porkchop_raw", {
|
||||
description = "Raw Porkchop",
|
||||
_doc_items_longdesc = "A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.",
|
||||
inventory_image = "mcl_mobitems_porkchop_raw.png",
|
||||
groups = { food = 2, eatable = 3 },
|
||||
on_use = minetest.item_eat(3),
|
||||
})
|
||||
end
|
||||
|
||||
if c("porkchop_cooked") then
|
||||
minetest.register_craftitem("mobs_mc:porkchop_cooked", {
|
||||
description = "Cooked Porkchop",
|
||||
_doc_items_longdesc = "Cooked porkchop is the cooked flesh of a pig and is used as food.",
|
||||
inventory_image = "mcl_mobitems_porkchop_cooked.png",
|
||||
groups = { food = 2, eatable = 8 },
|
||||
on_use = minetest.item_eat(8),
|
||||
})
|
||||
end
|
||||
|
||||
if c("porkchop_raw") and c("porkchop_cooked") then
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "mobs_mc:porkchop_cooked",
|
||||
recipe = "mobs_mc:porkchop_raw",
|
||||
cooktime = 5,
|
||||
})
|
||||
end
|
||||
|
||||
if c("carrot_on_a_stick") then
|
||||
minetest.register_tool("mobs_mc:carrot_on_a_stick", {
|
||||
description = "Carrot on a Stick",
|
||||
_doc_items_longdesc = "A carrot on a stick can be used on saddled pigs to ride them. Pigs will also follow anyone who holds a carrot on a stick near them.",
|
||||
_doc_items_usagehelp = "Rightclick a saddled pig with the carrot on a stick to mount it. You can now ride it like a horse.",
|
||||
wield_image = "mcl_mobitems_carrot_on_a_stick.png",
|
||||
inventory_image = "mcl_mobitems_carrot_on_a_stick.png",
|
||||
sounds = { breaks = "default_tool_breaks" },
|
||||
})
|
||||
end
|
||||
|
||||
-- Poor-man's recipes for carrot on a stick
|
||||
if c("carrot_on_a_stick") and c("stick") and c("string") and minetest.get_modpath("farming") then
|
||||
minetest.register_craft({
|
||||
output = "mobs_mc:carrot_on_a_stick",
|
||||
recipe = {
|
||||
{"", "", "farming:string" },
|
||||
{"", "group:stick", "farming:string" },
|
||||
{"group:stick", "", "farming:bread" },
|
||||
}
|
||||
})
|
||||
|
||||
-- FIXME: Identify correct farming mod (check if it includes the carrot item)
|
||||
minetest.register_craft({
|
||||
output = "mobs_mc:carrot_on_a_stick",
|
||||
recipe = {
|
||||
{"", "", "farming:string" },
|
||||
{"", "group:stick", "farming:string" },
|
||||
{"group:stick", "", "farming:carrot" },
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
if c("carrot_on_a_stick") and c("stick") and c("string") and minetest.get_modpath("fishing") and minetest.get_modpath("farming") then
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "mobs_mc:carrot_on_a_stick",
|
||||
recipe = {"fishing:pole_wood", "farming:carrot"},
|
||||
})
|
||||
end
|
||||
|
||||
-- Rabbit
|
||||
if c("rabbit_raw") then
|
||||
minetest.register_craftitem("mobs_mc:rabbit_raw", {
|
||||
description = "Raw Rabbit",
|
||||
_doc_items_longdesc = "Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.",
|
||||
inventory_image = "mcl_mobitems_rabbit_raw.png",
|
||||
groups = { food = 2, eatable = 3 },
|
||||
on_use = minetest.item_eat(3),
|
||||
})
|
||||
end
|
||||
|
||||
if c("rabbit_cooked") then
|
||||
minetest.register_craftitem("mobs_mc:rabbit_cooked", {
|
||||
description = "Cooked Rabbit",
|
||||
_doc_items_longdesc = "This is a food item which can be eaten.",
|
||||
inventory_image = "mcl_mobitems_rabbit_cooked.png",
|
||||
groups = { food = 2, eatable = 5 },
|
||||
on_use = minetest.item_eat(5),
|
||||
})
|
||||
end
|
||||
|
||||
if c("rabbit_raw") and c("rabbit_cooked") then
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "mobs_mc:rabbit_cooked",
|
||||
recipe = "mobs_mc:rabbit_raw",
|
||||
cooktime = 5,
|
||||
})
|
||||
end
|
||||
|
||||
if c("rabbit_hide") then
|
||||
minetest.register_craftitem("mobs_mc:rabbit_hide", {
|
||||
description = "Rabbit Hide",
|
||||
_doc_items_longdesc = "Rabbit hide is used to create leather.",
|
||||
inventory_image = "mcl_mobitems_rabbit_hide.png"
|
||||
})
|
||||
end
|
||||
|
||||
if c("leather") and c("rabbit_hide") then
|
||||
minetest.register_craft({
|
||||
output = "mobs:leather",
|
||||
recipe = {
|
||||
{ "mobs_mc:rabbit_hide", "mobs_mc:rabbit_hide" },
|
||||
{ "mobs_mc:rabbit_hide", "mobs_mc:rabbit_hide" },
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
if c("rabbit_foot") then
|
||||
minetest.register_craftitem("mobs_mc:rabbit_foot", {
|
||||
description = "Rabbit's Foot",
|
||||
_doc_items_longdesc = "This item is used in brewing.",
|
||||
inventory_image = "mcl_mobitems_rabbit_foot.png"
|
||||
})
|
||||
end
|
||||
|
||||
-- Sheep
|
||||
if c("mutton_raw") then
|
||||
minetest.register_craftitem("mobs_mc:mutton_raw", {
|
||||
description = "Raw Mutton",
|
||||
_doc_items_longdesc = "Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.",
|
||||
inventory_image = "mcl_mobitems_mutton_raw.png",
|
||||
groups = { food = 2, eatable = 4 },
|
||||
on_use = minetest.item_eat(4),
|
||||
})
|
||||
end
|
||||
|
||||
if c("mutton_cooked") then
|
||||
minetest.register_craftitem("mobs_mc:mutton_cooked", {
|
||||
description = "Cooked Mutton",
|
||||
_doc_items_longdesc = "Cooked mutton is the cooked flesh from a sheep and is used as food.",
|
||||
inventory_image = "mcl_mobitems_mutton_cooked.png",
|
||||
groups = { food = 2, eatable = 8 },
|
||||
on_use = minetest.item_eat(8),
|
||||
})
|
||||
end
|
||||
|
||||
if c("mutton_raw") and c("mutton_cooked") then
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "mobs_mc:mutton_cooked",
|
||||
recipe = "mobs_mc:mutton_raw",
|
||||
cooktime = 5,
|
||||
})
|
||||
end
|
||||
|
||||
-- Shulker
|
||||
if c("shulker_shell") then
|
||||
minetest.register_craftitem("mobs_mc:shulker_shell", {
|
||||
description = "Shulker Shell",
|
||||
_doc_items_longdesc = "Shulker shells are used in crafting. They are dropped from dead shulkers.",
|
||||
inventory_image = "mcl_mobitems_shulker_shell.png",
|
||||
groups = { craftitem = 1 },
|
||||
})
|
||||
end
|
||||
|
||||
-- Magma cube
|
||||
if c("magma_cream") then
|
||||
minetest.register_craftitem("mobs_mc:magma_cream", {
|
||||
description = "Magma Cream",
|
||||
_doc_items_longdesc = "Magma cream is a crafting component.",
|
||||
wield_image = "mcl_mobitems_magma_cream.png",
|
||||
inventory_image = "mcl_mobitems_magma_cream.png",
|
||||
groups = { brewitem = 1 },
|
||||
})
|
||||
end
|
||||
|
||||
-- Slime
|
||||
if c("slimeball") then
|
||||
minetest.register_craftitem("mobs_mc:slimeball", {
|
||||
description = "Slimeball",
|
||||
_doc_items_longdesc = "Slimeballs are used in crafting. They are dropped from slimes.",
|
||||
inventory_image = "mcl_mobitems_slimeball.png"
|
||||
})
|
||||
if minetest.get_modpath("mesecons_materials") then
|
||||
minetest.register_craft({
|
||||
output = "mesecons_materials:glue",
|
||||
recipe = {{ "mobs_mc:slimeball" }},
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
-- Spider
|
||||
if c("spider_eye") then
|
||||
minetest.register_craftitem("mobs_mc:spider_eye", {
|
||||
description = "Spider Eye",
|
||||
_doc_items_longdesc = "Spider eyes are used mainly in crafting and brewing. Spider eyes can be eaten, but they poison you and reduce your health by 2 hit points.",
|
||||
inventory_image = "mcl_mobitems_spider_eye.png",
|
||||
wield_image = "mcl_mobitems_spider_eye.png",
|
||||
-- Simplified poisonous food
|
||||
groups = { food = 2, eatable = -2 },
|
||||
on_use = minetest.item_eat(-2),
|
||||
})
|
||||
end
|
||||
|
||||
-- Evoker
|
||||
if c("totem") then
|
||||
-- Totem of Undying
|
||||
minetest.register_craftitem("mobs_mc:totem", {
|
||||
description = S("Totem of Undying"),
|
||||
_tt_help = minetest.colorize(mcl_colors.GREEN, S("Protects you from death while wielding it")),
|
||||
_doc_items_longdesc = S("A totem of undying is a rare artifact which may safe you from certain death."),
|
||||
_doc_items_usagehelp = S("The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however."),
|
||||
inventory_image = "mcl_totems_totem.png",
|
||||
wield_image = "mcl_totems_totem.png",
|
||||
stack_max = 1,
|
||||
groups = {combat_item = 1, offhand_item = 1},
|
||||
})
|
||||
end
|
||||
|
||||
-- Rotten flesh
|
||||
if c("rotten_flesh") then
|
||||
minetest.register_craftitem("mobs_mc:rotten_flesh", {
|
||||
description = "Rotten Flesh",
|
||||
_doc_items_longdesc = "Yuck! This piece of flesh clearly has seen better days. Eating it will only poison you and reduces your health by 4 hit points. But tamed wolves can eat it just fine.",
|
||||
inventory_image = "mcl_mobitems_rotten_flesh.png",
|
||||
-- Simplified poisonous food
|
||||
groups = { food = 2, eatable = -4 },
|
||||
on_use = minetest.item_eat(-4),
|
||||
})
|
||||
end
|
||||
|
||||
-- Misc.
|
||||
if c("nether_star") then
|
||||
minetest.register_craftitem("mobs_mc:nether_star", {
|
||||
description = "Nether Star",
|
||||
_doc_items_longdesc = "A nether star is a crafting component. It is dropped from the Wither.",
|
||||
inventory_image = "mcl_mobitems_nether_star.png"
|
||||
})
|
||||
end
|
||||
|
||||
if c("snowball") and minetest.get_modpath("default") then
|
||||
minetest.register_craft({
|
||||
output = "mobs_mc:snowball 2",
|
||||
recipe = {
|
||||
{"default:snow"},
|
||||
},
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "default:snow 2",
|
||||
recipe = {
|
||||
{"mobs_mc:snowball", "mobs_mc:snowball"},
|
||||
{"mobs_mc:snowball", "mobs_mc:snowball"},
|
||||
},
|
||||
})
|
||||
-- Change the appearance of default snow to avoid confusion with snowball
|
||||
minetest.override_item("default:snow", {
|
||||
inventory_image = "",
|
||||
wield_image = "",
|
||||
})
|
||||
end
|
||||
|
||||
if c("bone") then
|
||||
minetest.register_craftitem("mobs_mc:bone", {
|
||||
description = "Bone",
|
||||
_doc_items_longdesc = "Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.",
|
||||
_doc_items_usagehelp = "Hold the bone in your hand near wolves to attract them. Rightclick the wolf to give it a bone and tame it.",
|
||||
inventory_image = "mcl_mobitems_bone.png"
|
||||
})
|
||||
if minetest.get_modpath("bones") then
|
||||
minetest.register_craft({
|
||||
output = "mobs_mc:bone 3",
|
||||
recipe = {{ "bones:bones" }},
|
||||
})
|
||||
end
|
||||
end
|
|
@ -1,402 +0,0 @@
|
|||
--MCmobs v0.5
|
||||
--maikerumine
|
||||
--made for MC like Survival game
|
||||
--License for code WTFPL and otherwise stated in readmes
|
||||
|
||||
-- NOTE: Strings intentionally not marked for translation, other mods already have these items.
|
||||
-- TODO: Remove this file eventually, all items here are already outsourced in other mods.
|
||||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
--maikerumines throwing code
|
||||
--arrow (weapon)
|
||||
|
||||
local c = mobs_mc.is_item_variable_overridden
|
||||
|
||||
minetest.register_node("mobs_mc:arrow_box", {
|
||||
drawtype = "nodebox",
|
||||
is_ground_content = false,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
-- Shaft
|
||||
{-6.5/17, -1.5/17, -1.5/17, -4.5/17, 1.5/17, 1.5/17},
|
||||
{-4.5/17, -0.5/17, -0.5/17, 5.5/17, 0.5/17, 0.5/17},
|
||||
{5.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17},
|
||||
-- Tip
|
||||
{-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17},
|
||||
{-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17},
|
||||
-- Fletching
|
||||
{6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17},
|
||||
{7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17},
|
||||
{7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17},
|
||||
{6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17},
|
||||
|
||||
{7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17},
|
||||
{8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17},
|
||||
{8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17},
|
||||
{7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17},
|
||||
}
|
||||
},
|
||||
tiles = {"mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow_back.png", "mcl_bows_arrow_front.png", "mcl_bows_arrow.png", "mcl_bows_arrow.png^[transformFX"},
|
||||
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
groups = {not_in_creative_inventory=1, dig_immediate=3},
|
||||
node_placement_prediction = "",
|
||||
on_construct = function(pos)
|
||||
minetest.log("error", "[mobs_mc] Trying to construct mobs_mc:arrow_box at "..minetest.pos_to_string(pos))
|
||||
minetest.remove_node(pos)
|
||||
end,
|
||||
drop = "",
|
||||
})
|
||||
|
||||
local THROWING_ARROW_ENTITY={
|
||||
physical = false,
|
||||
timer=0,
|
||||
visual = "wielditem",
|
||||
visual_size = {x=0.1, y=0.1},
|
||||
textures = {"mobs_mc:arrow_box"},
|
||||
velocity = 10,
|
||||
lastpos={},
|
||||
collisionbox = {0,0,0,0,0,0},
|
||||
}
|
||||
|
||||
--ARROW CODE
|
||||
THROWING_ARROW_ENTITY.on_step = function(self, dtime)
|
||||
self.timer=self.timer+dtime
|
||||
local pos = self.object:get_pos()
|
||||
local node = minetest.get_node(pos)
|
||||
|
||||
minetest.add_particle({
|
||||
pos = pos,
|
||||
velocity = {x=0, y=0, z=0},
|
||||
acceleration = {x=0, y=0, z=0},
|
||||
expirationtime = .3,
|
||||
size = 1,
|
||||
collisiondetection = false,
|
||||
vertical = false,
|
||||
texture = "mobs_mc_arrow_particle.png",
|
||||
})
|
||||
|
||||
if self.timer>0.2 then
|
||||
local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 1.5)
|
||||
for k, obj in pairs(objs) do
|
||||
if obj:get_luaentity() ~= nil then
|
||||
if obj:get_luaentity().name ~= "mobs_mc:arrow_entity" and obj:get_luaentity().name ~= "__builtin:item" then
|
||||
local damage = 3
|
||||
minetest.sound_play("damage", {pos = pos}, true)
|
||||
obj:punch(self.object, 1.0, {
|
||||
full_punch_interval=1.0,
|
||||
damage_groups={fleshy=damage},
|
||||
}, nil)
|
||||
self.object:remove()
|
||||
end
|
||||
else
|
||||
local damage = 3
|
||||
minetest.sound_play("damage", {pos = pos}, true)
|
||||
obj:punch(self.object, 1.0, {
|
||||
full_punch_interval=1.0,
|
||||
damage_groups={fleshy=damage},
|
||||
}, nil)
|
||||
self.object:remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if self.lastpos.x~=nil then
|
||||
if node.name ~= "air" then
|
||||
minetest.sound_play("bowhit1", {pos = pos}, true)
|
||||
minetest.add_item(self.lastpos, 'mobs_mc:arrow')
|
||||
self.object:remove()
|
||||
end
|
||||
end
|
||||
self.lastpos={x=pos.x, y=pos.y, z=pos.z}
|
||||
end
|
||||
|
||||
minetest.register_entity("mobs_mc:arrow_entity", THROWING_ARROW_ENTITY)
|
||||
|
||||
local arrows = {
|
||||
{"mobs_mc:arrow", "mobs_mc:arrow_entity" },
|
||||
}
|
||||
|
||||
local throwing_shoot_arrow = function(itemstack, player)
|
||||
for _,arrow in pairs(arrows) do
|
||||
if player:get_inventory():get_stack("main", player:get_wield_index()+1):get_name() == arrow[1] then
|
||||
if not minetest.is_creative_enabled(player:get_player_name()) then
|
||||
player:get_inventory():remove_item("main", arrow[1])
|
||||
end
|
||||
local playerpos = player:get_pos()
|
||||
local obj = minetest.add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, arrow[2]) --mc
|
||||
local dir = player:get_look_dir()
|
||||
obj:set_velocity({x=dir.x*22, y=dir.y*22, z=dir.z*22})
|
||||
obj:set_acceleration({x=dir.x*-3, y=-10, z=dir.z*-3})
|
||||
obj:set_yaw(player:get_look_yaw()+math.pi)
|
||||
minetest.sound_play("throwing_sound", {pos=playerpos}, true)
|
||||
if obj:get_luaentity().player == "" then
|
||||
obj:get_luaentity().player = player
|
||||
end
|
||||
obj:get_luaentity().node = player:get_inventory():get_stack("main", 1):get_name()
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
if c("arrow") then
|
||||
minetest.register_craftitem("mobs_mc:arrow", {
|
||||
description = "Arrow",
|
||||
_doc_items_longdesc = "Arrows are ammunition for bows.",
|
||||
_doc_items_usagehelp = "To use arrows as ammunition for a bow, put them in the inventory slot following the bow. Slots are counted left to right, top to bottom.",
|
||||
inventory_image = "mcl_bows_arrow_inv.png",
|
||||
})
|
||||
end
|
||||
|
||||
if c("arrow") and c("flint") and c("feather") and c("stick") then
|
||||
minetest.register_craft({
|
||||
output = 'mobs_mc:arrow 4',
|
||||
recipe = {
|
||||
{mobs_mc.items.flint},
|
||||
{mobs_mc.items.stick},
|
||||
{mobs_mc.items.feather},
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
if c("bow") then
|
||||
minetest.register_tool("mobs_mc:bow_wood", {
|
||||
description = "Bow",
|
||||
_doc_items_longdesc = "Bows are ranged weapons to shoot arrows at your foes.",
|
||||
_doc_items_usagehelp = "To use the bow, you first need to have at least one arrow in slot following the bow. Leftclick to shoot. Each hit deals 3 damage.",
|
||||
inventory_image = "mcl_bows_bow.png",
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
if throwing_shoot_arrow(itemstack, user, pointed_thing) then
|
||||
if not minetest.is_creative_enabled(user:get_player_name()) then
|
||||
itemstack:add_wear(65535/50)
|
||||
end
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'mobs_mc:bow_wood',
|
||||
recipe = {
|
||||
{mobs_mc.items.string, mobs_mc.items.stick, ''},
|
||||
{mobs_mc.items.string, '', mobs_mc.items.stick},
|
||||
{mobs_mc.items.string, mobs_mc.items.stick, ''},
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
local how_to_throw = "Hold it in your and and leftclick to throw."
|
||||
|
||||
-- egg throwing item
|
||||
-- egg entity
|
||||
if c("egg") then
|
||||
local egg_GRAVITY = 9
|
||||
local egg_VELOCITY = 19
|
||||
|
||||
mobs:register_arrow("mobs_mc:egg_entity", {
|
||||
visual = "sprite",
|
||||
visual_size = {x=.5, y=.5},
|
||||
textures = {"mobs_chicken_egg.png"},
|
||||
velocity = egg_VELOCITY,
|
||||
|
||||
hit_player = function(self, player)
|
||||
player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, {
|
||||
full_punch_interval = 1.0,
|
||||
damage_groups = {},
|
||||
}, nil)
|
||||
end,
|
||||
|
||||
hit_mob = function(self, mob)
|
||||
mob:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, {
|
||||
full_punch_interval = 1.0,
|
||||
damage_groups = {},
|
||||
}, nil)
|
||||
end,
|
||||
|
||||
hit_node = function(self, pos, node)
|
||||
|
||||
if math.random(1, 10) > 1 then
|
||||
return
|
||||
end
|
||||
|
||||
pos.y = pos.y + 1
|
||||
|
||||
local nod = minetest.get_node_or_nil(pos)
|
||||
|
||||
if not nod
|
||||
or not minetest.registered_nodes[nod.name]
|
||||
or minetest.registered_nodes[nod.name].walkable == true then
|
||||
return
|
||||
end
|
||||
|
||||
local mob = minetest.add_entity(pos, "mobs_mc:chicken")
|
||||
local ent2 = mob:get_luaentity()
|
||||
|
||||
mob:set_properties({
|
||||
visual_size = {
|
||||
x = ent2.base_size.x / 2,
|
||||
y = ent2.base_size.y / 2
|
||||
},
|
||||
collisionbox = {
|
||||
ent2.base_colbox[1] / 2,
|
||||
ent2.base_colbox[2] / 2,
|
||||
ent2.base_colbox[3] / 2,
|
||||
ent2.base_colbox[4] / 2,
|
||||
ent2.base_colbox[5] / 2,
|
||||
ent2.base_colbox[6] / 2
|
||||
},
|
||||
})
|
||||
|
||||
ent2.child = true
|
||||
ent2.tamed = true
|
||||
ent2.owner = self.playername
|
||||
end
|
||||
})
|
||||
|
||||
-- shoot egg
|
||||
local mobs_shoot_egg = function (item, player, pointed_thing)
|
||||
|
||||
local playerpos = player:get_pos()
|
||||
|
||||
minetest.sound_play("default_place_node_hard", {
|
||||
pos = playerpos,
|
||||
gain = 1.0,
|
||||
max_hear_distance = 5,
|
||||
}, true)
|
||||
|
||||
local obj = minetest.add_entity({
|
||||
x = playerpos.x,
|
||||
y = playerpos.y +1.5,
|
||||
z = playerpos.z
|
||||
}, "mobs_mc:egg_entity")
|
||||
|
||||
local ent = obj:get_luaentity()
|
||||
local dir = player:get_look_dir()
|
||||
|
||||
ent.velocity = egg_VELOCITY -- needed for api internal timing
|
||||
ent.switch = 1 -- needed so that egg doesn't despawn straight away
|
||||
|
||||
obj:set_velocity({
|
||||
x = dir.x * egg_VELOCITY,
|
||||
y = dir.y * egg_VELOCITY,
|
||||
z = dir.z * egg_VELOCITY
|
||||
})
|
||||
|
||||
obj:set_acceleration({
|
||||
x = dir.x * -3,
|
||||
y = -egg_GRAVITY,
|
||||
z = dir.z * -3
|
||||
})
|
||||
|
||||
-- pass player name to egg for chick ownership
|
||||
local ent2 = obj:get_luaentity()
|
||||
ent2.playername = player:get_player_name()
|
||||
|
||||
if not minetest.is_creative_enabled(player:get_player_name()) then
|
||||
item:take_item()
|
||||
end
|
||||
|
||||
return item
|
||||
end
|
||||
|
||||
minetest.register_craftitem("mobs_mc:egg", {
|
||||
description = "Egg",
|
||||
_doc_items_longdesc = "Eggs can be thrown and break on impact. There is a small chance that 1 or even 4 chicks will pop out",
|
||||
_doc_items_usagehelp = how_to_throw,
|
||||
inventory_image = "mobs_chicken_egg.png",
|
||||
on_use = mobs_shoot_egg,
|
||||
})
|
||||
end
|
||||
|
||||
-- Snowball
|
||||
|
||||
local snowball_GRAVITY = 9
|
||||
local snowball_VELOCITY = 19
|
||||
|
||||
mobs:register_arrow("mobs_mc:snowball_entity", {
|
||||
visual = "sprite",
|
||||
visual_size = {x=.5, y=.5},
|
||||
textures = {"mcl_throwing_snowball.png"},
|
||||
velocity = snowball_VELOCITY,
|
||||
|
||||
hit_player = function(self, player)
|
||||
-- FIXME: No knockback
|
||||
player:punch(self.object, 1.0, {
|
||||
full_punch_interval = 1.0,
|
||||
damage_groups = {},
|
||||
}, nil)
|
||||
end,
|
||||
|
||||
hit_mob = function(self, mob)
|
||||
-- Hurt blazes, but not damage to anything else
|
||||
local dmg = {}
|
||||
if mob:get_luaentity().name == "mobs_mc:blaze" then
|
||||
dmg = {fleshy = 3}
|
||||
end
|
||||
-- FIXME: No knockback
|
||||
mob:punch(self.object, 1.0, {
|
||||
full_punch_interval = 1.0,
|
||||
damage_groups = dmg,
|
||||
}, nil)
|
||||
end,
|
||||
|
||||
})
|
||||
|
||||
if c("snowball") then
|
||||
-- shoot snowball
|
||||
local mobs_shoot_snowball = function (item, player, pointed_thing)
|
||||
|
||||
local playerpos = player:get_pos()
|
||||
|
||||
local obj = minetest.add_entity({
|
||||
x = playerpos.x,
|
||||
y = playerpos.y +1.5,
|
||||
z = playerpos.z
|
||||
}, "mobs_mc:snowball_entity")
|
||||
|
||||
local ent = obj:get_luaentity()
|
||||
local dir = player:get_look_dir()
|
||||
|
||||
ent.velocity = snowball_VELOCITY -- needed for api internal timing
|
||||
ent.switch = 1 -- needed so that egg doesn't despawn straight away
|
||||
|
||||
obj:set_velocity({
|
||||
x = dir.x * snowball_VELOCITY,
|
||||
y = dir.y * snowball_VELOCITY,
|
||||
z = dir.z * snowball_VELOCITY
|
||||
})
|
||||
|
||||
obj:set_acceleration({
|
||||
x = dir.x * -3,
|
||||
y = -snowball_GRAVITY,
|
||||
z = dir.z * -3
|
||||
})
|
||||
|
||||
-- pass player name to egg for chick ownership
|
||||
local ent2 = obj:get_luaentity()
|
||||
ent2.playername = player:get_player_name()
|
||||
|
||||
if not minetest.is_creative_enabled(player:get_player_name()) then
|
||||
item:take_item()
|
||||
end
|
||||
|
||||
return item
|
||||
end
|
||||
|
||||
|
||||
-- Snowball
|
||||
minetest.register_craftitem("mobs_mc:snowball", {
|
||||
description = "Snowball",
|
||||
_doc_items_longdesc = "Snowballs can be thrown at your enemies. A snowball deals 3 damage to blazes, but is harmless to anything else.",
|
||||
_doc_items_usagehelp = how_to_throw,
|
||||
inventory_image = "mcl_throwing_snowball.png",
|
||||
on_use = mobs_shoot_snowball,
|
||||
})
|
||||
end
|
||||
|
||||
--end maikerumine code
|
|
@ -1,65 +0,0 @@
|
|||
local pr = PseudoRandom(os.time()*5)
|
||||
|
||||
local offsets = {}
|
||||
for x=-2, 2 do
|
||||
for z=-2, 2 do
|
||||
table.insert(offsets, {x=x, y=0, z=z})
|
||||
end
|
||||
end
|
||||
|
||||
--[[ Periodically check and teleport mob to owner if not sitting (order ~= "sit") and
|
||||
the owner is too far away. To be used with do_custom. Note: Optimized for mobs smaller than 1×1×1.
|
||||
Larger mobs might have space problems after teleportation.
|
||||
|
||||
* dist: Minimum required distance from owner to teleport. Default: 12
|
||||
* teleport_check_interval: Optional. Interval in seconds to check the mob teleportation. Default: 4 ]]
|
||||
mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval)
|
||||
return function(self, dtime)
|
||||
-- No teleportation if no owner or if sitting
|
||||
if not self.owner or self.order == "sit" then
|
||||
return
|
||||
end
|
||||
if not teleport_check_interval then
|
||||
teleport_check_interval = 4
|
||||
end
|
||||
if not dist then
|
||||
dist = 12
|
||||
end
|
||||
if self._teleport_timer == nil then
|
||||
self._teleport_timer = teleport_check_interval
|
||||
return
|
||||
end
|
||||
self._teleport_timer = self._teleport_timer - dtime
|
||||
if self._teleport_timer <= 0 then
|
||||
self._teleport_timer = teleport_check_interval
|
||||
local mob_pos = self.object:get_pos()
|
||||
local owner = minetest.get_player_by_name(self.owner)
|
||||
if not owner then
|
||||
-- No owner found, no teleportation
|
||||
return
|
||||
end
|
||||
local owner_pos = owner:get_pos()
|
||||
local dist_from_owner = vector.distance(owner_pos, mob_pos)
|
||||
if dist_from_owner > dist then
|
||||
-- Check for nodes below air in a 5×1×5 area around the owner position
|
||||
local check_offsets = table.copy(offsets)
|
||||
-- Attempt to place mob near player. Must be placed on walkable node below a non-walkable one. Place inside that air node.
|
||||
while #check_offsets > 0 do
|
||||
local r = pr:next(1, #check_offsets)
|
||||
local telepos = vector.add(owner_pos, check_offsets[r])
|
||||
local telepos_below = {x=telepos.x, y=telepos.y-1, z=telepos.z}
|
||||
table.remove(check_offsets, r)
|
||||
-- Long story short, spawn on a platform
|
||||
local trynode = minetest.registered_nodes[minetest.get_node(telepos).name]
|
||||
local trybelownode = minetest.registered_nodes[minetest.get_node(telepos_below).name]
|
||||
if trynode and not trynode.walkable and
|
||||
trybelownode and trybelownode.walkable then
|
||||
-- Correct position found! Let's teleport.
|
||||
self.object:set_pos(telepos)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,62 +0,0 @@
|
|||
--MC Heads for minetest
|
||||
--maikerumine
|
||||
|
||||
-- NOTE: Strings intentionally not marked for translation, other mods already have these items.
|
||||
-- TODO: Remove this file eventually, all items here are already outsourced in other mods.
|
||||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
-- Heads system
|
||||
|
||||
local sounds
|
||||
if minetest.get_modpath("default") then
|
||||
sounds = default.node_sound_defaults({
|
||||
footstep = {name="default_hard_footstep", gain=0.3}
|
||||
})
|
||||
end
|
||||
|
||||
local function addhead(mobname, desc, longdesc)
|
||||
if not mobs_mc.is_item_variable_overridden("head_"..mobname) then
|
||||
return
|
||||
end
|
||||
minetest.register_node("mobs_mc:head_"..mobname, {
|
||||
description = desc,
|
||||
_doc_items_longdesc = longdesc,
|
||||
drawtype = "nodebox",
|
||||
is_ground_content = false,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, },
|
||||
},
|
||||
},
|
||||
groups = { oddly_breakable_by_hand=3, head=1, },
|
||||
-- The head textures are based off the textures of an actual mob.
|
||||
-- FIXME: This code assumes 16×16 textures for the mob textures!
|
||||
tiles = {
|
||||
-- Note: bottom texture is overlaid over top texture to get rid of possible transparency.
|
||||
-- This is required for skeleton skull and wither skeleton skull.
|
||||
"[combine:16x16:-4,4=mobs_mc_"..mobname..".png", -- top
|
||||
"([combine:16x16:-4,4=mobs_mc_"..mobname..".png)^([combine:16x16:-12,4=mobs_mc_"..mobname..".png)", -- bottom
|
||||
"[combine:16x16:-12,0=mobs_mc_"..mobname..".png", -- left
|
||||
"[combine:16x16:4,0=mobs_mc_"..mobname..".png", -- right
|
||||
"[combine:16x16:-20,0=mobs_mc_"..mobname..".png", -- back
|
||||
"[combine:16x16:-4,0=mobs_mc_"..mobname..".png", -- front
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
walkable = true,
|
||||
sounds = sounds,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, },
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
-- Add heads
|
||||
addhead("zombie", "Zombie Head", "A zombie head is a small decorative block which resembles the head of a zombie.")
|
||||
addhead("creeper", "Creeper Head", "A creeper head is a small decorative block which resembles the head of a creeper.")
|
||||
addhead("skeleton", "Skeleton Skull", "A skeleton skull is a small decorative block which resembles the skull of a skeleton.")
|
||||
addhead("wither_skeleton", "Wither Skeleton Skull", "A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton.")
|
|
@ -1,20 +0,0 @@
|
|||
local function is_forbidden_node(pos, node)
|
||||
node = node or minetest.get_node(pos)
|
||||
return minetest.get_item_group(node.name, "stair") > 0 or minetest.get_item_group(node.name, "slab") > 0 or minetest.get_item_group(node.name, "carpet") > 0
|
||||
end
|
||||
|
||||
function mobs:spawn_abm_check(pos, node, name)
|
||||
-- Don't spawn monsters on mycelium
|
||||
if (node.name == "mcl_core:mycelium" or node.name == "mcl_core:mycelium_snow") and minetest.registered_entities[name].type == "monster" then
|
||||
return true
|
||||
--Don't Spawn mobs on stairs, slabs, or carpets
|
||||
elseif is_forbidden_node(pos, node) or is_forbidden_node(vector.add(pos, vector.new(0, 1, 0))) then
|
||||
return true
|
||||
-- Spawn on opaque or liquid nodes
|
||||
elseif minetest.get_item_group(node.name, "opaque") ~= 0 or minetest.registered_nodes[node.name].liquidtype ~= "none" or node.name == "mcl_core:grass_path" then
|
||||
return false
|
||||
end
|
||||
|
||||
-- Reject everything else
|
||||
return true
|
||||
end
|
|
@ -75,6 +75,7 @@ Origin of those models:
|
|||
* `mobs_mc_mushroom_brown.png` (CC0)
|
||||
|
||||
* “Spawn egg” textures (`mobs_mc_spawn_icon_*`) by 22i
|
||||
* Llama decor (carpet) textures (`mobs_mc_llama_decor_*`) by erlehmann and rudzik8
|
||||
* Any other texture not mentioned here are licensed under the MIT License
|
||||
|
||||
## Sounds
|
||||
|
|
|
@ -17,11 +17,6 @@ This mod adds mobs which closely resemble the mobs from the game Minecraft, vers
|
|||
* Code: GNU General Public License, version 3 (see `LICENSE`)
|
||||
* Media: MIT, CC0, CC BY 3.0 CC BY-SA 4.0, LGPLv2.1, GPLv3. See `LICENSE_media.md` for details
|
||||
|
||||
## Useful information for developers
|
||||
|
||||
### Game integration
|
||||
Want to include this mod in your game? Read `gameconfig.md`.
|
||||
|
||||
### Links
|
||||
|
||||
* [`mobs_mc`](https://github.com/maikerumine/mobs_mc)
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
--###################
|
||||
--################### AGENT - seemingly unused
|
||||
--###################
|
||||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
mobs:register_mob("mobs_mc:agent", {
|
||||
type = "npc",
|
||||
spawn_class = "passive",
|
||||
passive = true,
|
||||
hp_min = 20,
|
||||
hp_max = 20,
|
||||
armor = 100,
|
||||
collisionbox = {-0.35, -0.01, -0.35, 0.35, 1, 0.35},
|
||||
visual = "mesh",
|
||||
mesh = "mobs_mc_agent.b3d",
|
||||
textures = {
|
||||
{"mobs_mc_agent.png"},
|
||||
},
|
||||
-- TODO: sounds
|
||||
visual_size = {x=3, y=3},
|
||||
walk_chance = 0,
|
||||
walk_velocity = 0.6,
|
||||
run_velocity = 2,
|
||||
jump = true,
|
||||
animation = {
|
||||
stand_speed = 25,
|
||||
walk_speed = 25,
|
||||
run_speed = 50,
|
||||
stand_start = 20,
|
||||
stand_end = 60,
|
||||
walk_start = 0,
|
||||
walk_end = 20,
|
||||
run_start = 0,
|
||||
run_end = 20,
|
||||
},
|
||||
})
|
||||
|
||||
mobs:register_egg("mobs_mc:agent", S("Agent"), "mobs_mc_spawn_icon_agent.png", 0)
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
mobs:register_mob("mobs_mc:bat", {
|
||||
mcl_mobs:register_mob("mobs_mc:bat", {
|
||||
description = S("Bat"),
|
||||
type = "animal",
|
||||
spawn_class = "ambient",
|
||||
|
@ -65,7 +65,7 @@ else
|
|||
end
|
||||
|
||||
-- Spawn on solid blocks at or below Sea level and the selected light level
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:bat",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -138,9 +138,9 @@ maxlight,
|
|||
20,
|
||||
5000,
|
||||
2,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.water-1)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mobs_mc.water_level-1)
|
||||
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:bat", S("Bat"), "mobs_mc_spawn_icon_bat.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:bat", S("Bat"), "mobs_mc_spawn_icon_bat.png", 0)
|
||||
|
|
|
@ -12,7 +12,7 @@ local mod_target = minetest.get_modpath("mcl_target")
|
|||
--###################
|
||||
|
||||
|
||||
mobs:register_mob("mobs_mc:blaze", {
|
||||
mcl_mobs:register_mob("mobs_mc:blaze", {
|
||||
description = S("Blaze"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -41,7 +41,7 @@ mobs:register_mob("mobs_mc:blaze", {
|
|||
reach = 2,
|
||||
pathfinding = 1,
|
||||
drops = {
|
||||
{name = mobs_mc.items.blaze_rod,
|
||||
{name = "mcl_mobitems:blaze_rod",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 1,
|
||||
|
@ -131,7 +131,7 @@ mobs:register_mob("mobs_mc:blaze", {
|
|||
end,
|
||||
})
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:blaze",
|
||||
"nether",
|
||||
"ground",
|
||||
|
@ -141,11 +141,11 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
5000,
|
||||
3,
|
||||
mobs_mc.spawn_height.nether_min,
|
||||
mobs_mc.spawn_height.nether_max)
|
||||
mcl_vars.mg_nether_min,
|
||||
mcl_vars.mg_nether_max)
|
||||
|
||||
-- Blaze fireball
|
||||
mobs:register_arrow("mobs_mc:blaze_fireball", {
|
||||
mcl_mobs:register_arrow("mobs_mc:blaze_fireball", {
|
||||
visual = "sprite",
|
||||
visual_size = {x = 0.3, y = 0.3},
|
||||
textures = {"mcl_fire_fire_charge.png"},
|
||||
|
@ -181,7 +181,7 @@ mobs:register_arrow("mobs_mc:blaze_fireball", {
|
|||
-- Node hit, make fire
|
||||
hit_node = function(self, pos, node)
|
||||
if node == "air" then
|
||||
minetest.set_node(pos, {name = mobs_mc.items.fire})
|
||||
minetest.set_node(pos, {name = "mcl_fire:fire"})
|
||||
else
|
||||
if self._shot_from_dispenser and mod_target and node == "mcl_target:target_off" then
|
||||
mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks
|
||||
|
@ -193,11 +193,11 @@ mobs:register_arrow("mobs_mc:blaze_fireball", {
|
|||
-- Set fire if node is air, or a replacable flammable node (e.g. a plant)
|
||||
if crashnode.name == "air" or
|
||||
(cndef and cndef.buildable_to and minetest.get_item_group(crashnode.name, "flammable") >= 1) then
|
||||
minetest.set_node(crashpos, {name = mobs_mc.items.fire})
|
||||
minetest.set_node(crashpos, {name = "mcl_fire:fire"})
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:blaze", S("Blaze"), "mobs_mc_spawn_icon_blaze.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:blaze", S("Blaze"), "mobs_mc_spawn_icon_blaze.png", 0)
|
||||
|
|
|
@ -8,7 +8,7 @@ local S = minetest.get_translator("mobs_mc")
|
|||
|
||||
|
||||
|
||||
mobs:register_mob("mobs_mc:chicken", {
|
||||
mcl_mobs:register_mob("mobs_mc:chicken", {
|
||||
description = S("Chicken"),
|
||||
type = "animal",
|
||||
spawn_class = "passive",
|
||||
|
@ -30,12 +30,12 @@ mobs:register_mob("mobs_mc:chicken", {
|
|||
makes_footstep_sound = true,
|
||||
walk_velocity = 1,
|
||||
drops = {
|
||||
{name = mobs_mc.items.chicken_raw,
|
||||
{name = "mcl_mobitems:chicken",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "common",},
|
||||
{name = mobs_mc.items.feather,
|
||||
{name = "mcl_mobitems:feather",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
|
@ -64,14 +64,19 @@ mobs:register_mob("mobs_mc:chicken", {
|
|||
run_start = 0, run_end = 40,
|
||||
},
|
||||
|
||||
follow = mobs_mc.follow.chicken,
|
||||
follow = {
|
||||
"mcl_farming:wheat_seeds",
|
||||
"mcl_farming:melon_seeds",
|
||||
"mcl_farming:pumpkin_seeds",
|
||||
"mcl_farming:beetroot_seeds",
|
||||
},
|
||||
view_range = 16,
|
||||
fear_height = 4,
|
||||
|
||||
on_rightclick = function(self, clicker)
|
||||
if mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mobs:protect(self, clicker) then return end
|
||||
if mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mcl_mobs:protect(self, clicker) then return end
|
||||
if mcl_mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end
|
||||
end,
|
||||
|
||||
do_custom = function(self, dtime)
|
||||
|
@ -89,7 +94,7 @@ mobs:register_mob("mobs_mc:chicken", {
|
|||
|
||||
local pos = self.object:get_pos()
|
||||
|
||||
minetest.add_item(pos, mobs_mc.items.egg)
|
||||
minetest.add_item(pos, "mcl_throwing:egg")
|
||||
|
||||
minetest.sound_play("mobs_mc_chicken_lay_egg", {
|
||||
pos = pos,
|
||||
|
@ -101,7 +106,7 @@ mobs:register_mob("mobs_mc:chicken", {
|
|||
})
|
||||
|
||||
--spawn
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:chicken",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -147,8 +152,8 @@ mobs:spawn_specific(
|
|||
minetest.LIGHT_MAX+1,
|
||||
30, 17000,
|
||||
3,
|
||||
mobs_mc.spawn_height.water,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mobs_mc.water_level,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:chicken", S("Chicken"), "mobs_mc_spawn_icon_chicken.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:chicken", S("Chicken"), "mobs_mc_spawn_icon_chicken.png", 0)
|
||||
|
|
|
@ -21,12 +21,12 @@ local cow_def = {
|
|||
makes_footstep_sound = true,
|
||||
walk_velocity = 1,
|
||||
drops = {
|
||||
{name = mobs_mc.items.beef_raw,
|
||||
{name = "mcl_mobitems:beef",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 3,
|
||||
looting = "common",},
|
||||
{name = mobs_mc.items.leather,
|
||||
{name = "mcl_mobitems:leather",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
|
@ -47,38 +47,37 @@ local cow_def = {
|
|||
walk_end = 40, run_start = 0,
|
||||
run_end = 40,
|
||||
},
|
||||
follow = mobs_mc.follow.cow,
|
||||
on_rightclick = function(self, clicker)
|
||||
if mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mobs:protect(self, clicker) then return end
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mcl_mobs:protect(self, clicker) then return end
|
||||
|
||||
if self.child then
|
||||
return
|
||||
end
|
||||
|
||||
local item = clicker:get_wielded_item()
|
||||
if item:get_name() == mobs_mc.items.bucket and clicker:get_inventory() then
|
||||
if item:get_name() == "mcl_buckets:bucket_empty" and clicker:get_inventory() then
|
||||
local inv = clicker:get_inventory()
|
||||
inv:remove_item("main", mobs_mc.items.bucket)
|
||||
inv:remove_item("main", "mcl_buckets:bucket_empty")
|
||||
minetest.sound_play("mobs_mc_cow_milk", {pos=self.object:get_pos(), gain=0.6})
|
||||
-- if room add bucket of milk to inventory, otherwise drop as item
|
||||
if inv:room_for_item("main", {name=mobs_mc.items.milk}) then
|
||||
clicker:get_inventory():add_item("main", mobs_mc.items.milk)
|
||||
if inv:room_for_item("main", {name = "mcl_mobitems:milk_bucket"}) then
|
||||
clicker:get_inventory():add_item("main", "mcl_mobitems:milk_bucket")
|
||||
else
|
||||
local pos = self.object:get_pos()
|
||||
pos.y = pos.y + 0.5
|
||||
minetest.add_item(pos, {name = mobs_mc.items.milk})
|
||||
minetest.add_item(pos, {name = "mcl_mobitems:milk_bucket"})
|
||||
end
|
||||
return
|
||||
end
|
||||
mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
end,
|
||||
follow = mobs_mc.items.wheat,
|
||||
follow = "mcl_farming:wheat_item",
|
||||
view_range = 10,
|
||||
fear_height = 4,
|
||||
}
|
||||
|
||||
mobs:register_mob("mobs_mc:cow", cow_def)
|
||||
mcl_mobs:register_mob("mobs_mc:cow", cow_def)
|
||||
|
||||
-- Mooshroom
|
||||
local mooshroom_def = table.copy(cow_def)
|
||||
|
@ -86,22 +85,22 @@ mooshroom_def.description = S("Mooshroom")
|
|||
mooshroom_def.mesh = "mobs_mc_cow.b3d"
|
||||
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 mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mobs:protect(self, clicker) then return end
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mcl_mobs:protect(self, clicker) then return end
|
||||
|
||||
if self.child then
|
||||
return
|
||||
end
|
||||
local item = clicker:get_wielded_item()
|
||||
-- Use shears to get mushrooms and turn mooshroom into cow
|
||||
if item:get_name() == mobs_mc.items.shears then
|
||||
if item:get_name() == "mcl_tools:shears" then
|
||||
local pos = self.object:get_pos()
|
||||
minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true)
|
||||
|
||||
if self.base_texture[1] == "mobs_mc_mooshroom_brown.png" then
|
||||
minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_brown .. " 5")
|
||||
minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_mushrooms:mushroom_brown 5")
|
||||
else
|
||||
minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_red .. " 5")
|
||||
minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_mushrooms:mushroom_red 5")
|
||||
end
|
||||
|
||||
local oldyaw = self.object:get_yaw()
|
||||
|
@ -110,43 +109,43 @@ mooshroom_def.on_rightclick = function(self, clicker)
|
|||
cow:set_yaw(oldyaw)
|
||||
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:add_wear(mobs_mc.misc.shears_wear)
|
||||
item:add_wear(mobs_mc.shears_wear)
|
||||
clicker:get_inventory():set_stack("main", clicker:get_wield_index(), item)
|
||||
end
|
||||
-- Use bucket to milk
|
||||
elseif item:get_name() == mobs_mc.items.bucket and clicker:get_inventory() then
|
||||
elseif item:get_name() == "mcl_buckets:bucket_empty" and clicker:get_inventory() then
|
||||
local inv = clicker:get_inventory()
|
||||
inv:remove_item("main", mobs_mc.items.bucket)
|
||||
inv:remove_item("main", "mcl_buckets:bucket_empty")
|
||||
minetest.sound_play("mobs_mc_cow_milk", {pos=self.object:get_pos(), gain=0.6})
|
||||
-- If room, add milk to inventory, otherwise drop as item
|
||||
if inv:room_for_item("main", {name=mobs_mc.items.milk}) then
|
||||
clicker:get_inventory():add_item("main", mobs_mc.items.milk)
|
||||
if inv:room_for_item("main", {name="mcl_mobitems:milk_bucket"}) then
|
||||
clicker:get_inventory():add_item("main", "mcl_mobitems:milk_bucket")
|
||||
else
|
||||
local pos = self.object:get_pos()
|
||||
pos.y = pos.y + 0.5
|
||||
minetest.add_item(pos, {name = mobs_mc.items.milk})
|
||||
minetest.add_item(pos, {name = "mcl_mobitems:milk_bucket"})
|
||||
end
|
||||
-- Use bowl to get mushroom stew
|
||||
elseif item:get_name() == mobs_mc.items.bowl and clicker:get_inventory() then
|
||||
elseif item:get_name() == "mcl_core:bowl" and clicker:get_inventory() then
|
||||
local inv = clicker:get_inventory()
|
||||
inv:remove_item("main", mobs_mc.items.bowl)
|
||||
inv:remove_item("main", "mcl_core:bowl")
|
||||
minetest.sound_play("mobs_mc_cow_mushroom_stew", {pos=self.object:get_pos(), gain=0.6})
|
||||
-- If room, add mushroom stew to inventory, otherwise drop as item
|
||||
if inv:room_for_item("main", {name=mobs_mc.items.mushroom_stew}) then
|
||||
clicker:get_inventory():add_item("main", mobs_mc.items.mushroom_stew)
|
||||
if inv:room_for_item("main", {name="mcl_mushrooms:mushroom_stew"}) then
|
||||
clicker:get_inventory():add_item("main", "mcl_mushrooms:mushroom_stew")
|
||||
else
|
||||
local pos = self.object:get_pos()
|
||||
pos.y = pos.y + 0.5
|
||||
minetest.add_item(pos, {name = mobs_mc.items.mushroom_stew})
|
||||
minetest.add_item(pos, {name = "mcl_mushrooms:mushroom_stew"})
|
||||
end
|
||||
end
|
||||
mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
end
|
||||
mobs:register_mob("mobs_mc:mooshroom", mooshroom_def)
|
||||
mcl_mobs:register_mob("mobs_mc:mooshroom", mooshroom_def)
|
||||
|
||||
|
||||
-- Spawning
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:cow",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -193,12 +192,12 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
17000,
|
||||
10,
|
||||
mobs_mc.spawn_height.water,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mobs_mc.water_level,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:mooshroom",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -211,9 +210,9 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
17000,
|
||||
5,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn egg
|
||||
mobs:register_egg("mobs_mc:cow", S("Cow"), "mobs_mc_spawn_icon_cow.png", 0)
|
||||
mobs:register_egg("mobs_mc:mooshroom", S("Mooshroom"), "mobs_mc_spawn_icon_mooshroom.png", 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)
|
||||
|
|
|
@ -9,7 +9,7 @@ local S = minetest.get_translator("mobs_mc")
|
|||
|
||||
|
||||
|
||||
mobs:register_mob("mobs_mc:creeper", {
|
||||
mcl_mobs:register_mob("mobs_mc:creeper", {
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
hp_min = 20,
|
||||
|
@ -58,7 +58,7 @@ mobs:register_mob("mobs_mc:creeper", {
|
|||
return
|
||||
end
|
||||
local item = clicker:get_wielded_item()
|
||||
if item:get_name() == mobs_mc.items.flint_and_steel then
|
||||
if item:get_name() == "mcl_fire:flint_and_steel" then
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
-- Wear tool
|
||||
local wdef = item:get_definition()
|
||||
|
@ -77,7 +77,7 @@ mobs:register_mob("mobs_mc:creeper", {
|
|||
if self._forced_explosion_countdown_timer ~= nil then
|
||||
self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime
|
||||
if self._forced_explosion_countdown_timer <= 0 then
|
||||
mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength)
|
||||
mcl_mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength)
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
@ -88,14 +88,14 @@ mobs:register_mob("mobs_mc:creeper", {
|
|||
if luaentity and luaentity.name:find("arrow") then
|
||||
local shooter_luaentity = luaentity._shooter and luaentity._shooter:get_luaentity()
|
||||
if shooter_luaentity and (shooter_luaentity.name == "mobs_mc:skeleton" or shooter_luaentity.name == "mobs_mc:stray") then
|
||||
minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, mobs_mc.items.music_discs[math.random(1, #mobs_mc.items.music_discs)])
|
||||
minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, "mcl_jukebox:record_" .. math.random(9))
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
maxdrops = 2,
|
||||
drops = {
|
||||
{name = mobs_mc.items.gunpowder,
|
||||
{name = "mcl_mobitems:gunpowder",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
|
@ -103,7 +103,7 @@ mobs:register_mob("mobs_mc:creeper", {
|
|||
|
||||
-- Head
|
||||
-- TODO: Only drop if killed by charged creeper
|
||||
{name = mobs_mc.items.head_creeper,
|
||||
{name = "mcl_heads:creeper",
|
||||
chance = 200, -- 0.5%
|
||||
min = 1,
|
||||
max = 1,},
|
||||
|
@ -129,7 +129,7 @@ mobs:register_mob("mobs_mc:creeper", {
|
|||
view_range = 16,
|
||||
})
|
||||
|
||||
mobs:register_mob("mobs_mc:creeper_charged", {
|
||||
mcl_mobs:register_mob("mobs_mc:creeper_charged", {
|
||||
description = S("Creeper"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -180,7 +180,7 @@ mobs:register_mob("mobs_mc:creeper_charged", {
|
|||
return
|
||||
end
|
||||
local item = clicker:get_wielded_item()
|
||||
if item:get_name() == mobs_mc.items.flint_and_steel then
|
||||
if item:get_name() == "mcl_fire:flint_and_steel" then
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
-- Wear tool
|
||||
local wdef = item:get_definition()
|
||||
|
@ -199,7 +199,7 @@ mobs:register_mob("mobs_mc:creeper_charged", {
|
|||
if self._forced_explosion_countdown_timer ~= nil then
|
||||
self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime
|
||||
if self._forced_explosion_countdown_timer <= 0 then
|
||||
mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength)
|
||||
mcl_mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength)
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
@ -210,14 +210,14 @@ mobs:register_mob("mobs_mc:creeper_charged", {
|
|||
if luaentity and luaentity.name:find("arrow") then
|
||||
local shooter_luaentity = luaentity._shooter and luaentity._shooter:get_luaentity()
|
||||
if shooter_luaentity and (shooter_luaentity.name == "mobs_mc:skeleton" or shooter_luaentity.name == "mobs_mc:stray") then
|
||||
minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, mobs_mc.items.music_discs[math.random(1, #mobs_mc.items.music_discs)])
|
||||
minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, "mcl_jukebox:record_" .. math.random(9))
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
maxdrops = 2,
|
||||
drops = {
|
||||
{name = mobs_mc.items.gunpowder,
|
||||
{name = "mcl_mobitems:gunpowder",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
|
@ -225,7 +225,7 @@ mobs:register_mob("mobs_mc:creeper_charged", {
|
|||
|
||||
-- Head
|
||||
-- TODO: Only drop if killed by charged creeper
|
||||
{name = mobs_mc.items.head_creeper,
|
||||
{name = "mcl_heads:creeper",
|
||||
chance = 200, -- 0.5%
|
||||
min = 1,
|
||||
max = 1,},
|
||||
|
@ -254,7 +254,7 @@ mobs:register_mob("mobs_mc:creeper_charged", {
|
|||
glow = 3,
|
||||
})
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:creeper",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -404,8 +404,8 @@ mobs:spawn_specific(
|
|||
20,
|
||||
16500,
|
||||
2,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:creeper", S("Creeper"), "mobs_mc_spawn_icon_creeper.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:creeper", S("Creeper"), "mobs_mc_spawn_icon_creeper.png", 0)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
mobs:register_mob("mobs_mc:enderdragon", {
|
||||
mcl_mobs:register_mob("mobs_mc:enderdragon", {
|
||||
description = S("Ender Dragon"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -98,7 +98,7 @@ mobs:register_mob("mobs_mc:enderdragon", {
|
|||
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 = mobs_mc.items.dragon_egg})
|
||||
minetest.set_node(vector.add(self._portal_pos, vector.new(3, 5, 3)), {name = "mcl_end:dragon_egg"})
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
@ -109,7 +109,7 @@ mobs:register_mob("mobs_mc:enderdragon", {
|
|||
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
|
||||
|
||||
-- dragon fireball (projectile)
|
||||
mobs:register_arrow("mobs_mc:dragon_fireball", {
|
||||
mcl_mobs:register_arrow("mobs_mc:dragon_fireball", {
|
||||
visual = "sprite",
|
||||
visual_size = {x = 1.25, y = 1.25},
|
||||
textures = {"mobs_mc_dragon_fireball.png"},
|
||||
|
@ -133,10 +133,10 @@ mobs:register_arrow("mobs_mc:dragon_fireball", {
|
|||
|
||||
-- node hit, explode
|
||||
hit_node = function(self, pos, node)
|
||||
mobs:boom(self, pos, 2)
|
||||
mcl_mobs:boom(self, pos, 2)
|
||||
end
|
||||
})
|
||||
|
||||
mobs:register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "mobs_mc_spawn_icon_dragon.png", 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")
|
||||
|
|
|
@ -48,6 +48,37 @@ local take_frequency_max = 245
|
|||
local place_frequency_min = 235
|
||||
local place_frequency_max = 245
|
||||
|
||||
|
||||
-- Texuture overrides for enderman block. Required for cactus because it's original is a nodebox
|
||||
-- and the textures have tranparent pixels.
|
||||
local block_texture_overrides
|
||||
do
|
||||
local cbackground = "mobs_mc_enderman_cactus_background.png"
|
||||
local ctiles = minetest.registered_nodes["mcl_core:cactus"].tiles
|
||||
|
||||
local ctable = {}
|
||||
local last
|
||||
for i=1, 6 do
|
||||
if ctiles[i] then
|
||||
last = ctiles[i]
|
||||
end
|
||||
table.insert(ctable, cbackground .. "^" .. last)
|
||||
end
|
||||
|
||||
block_texture_overrides = {
|
||||
["mcl_core:cactus"] = ctable,
|
||||
-- FIXME: replace colorize colors with colors from palette
|
||||
["mcl_core:dirt_with_grass"] =
|
||||
{
|
||||
"mcl_core_grass_block_top.png^[colorize:green:90",
|
||||
"default_dirt.png",
|
||||
"default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)",
|
||||
"default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)",
|
||||
"default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)",
|
||||
"default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)"}
|
||||
}
|
||||
end
|
||||
|
||||
-- Create the textures table for the enderman, depending on which kind of block
|
||||
-- the enderman holds (if any).
|
||||
local create_enderman_textures = function(block_type, itemstring)
|
||||
|
@ -69,9 +100,9 @@ local create_enderman_textures = function(block_type, itemstring)
|
|||
local tiles = minetest.registered_nodes[itemstring].tiles
|
||||
local textures = {}
|
||||
local last
|
||||
if mobs_mc.enderman_block_texture_overrides[itemstring] then
|
||||
if block_texture_overrides[itemstring] then
|
||||
-- Texture override available? Use these instead!
|
||||
textures = mobs_mc.enderman_block_texture_overrides[itemstring]
|
||||
textures = block_texture_overrides[itemstring]
|
||||
else
|
||||
-- Extract the texture names
|
||||
for i = 1, 6 do
|
||||
|
@ -189,7 +220,7 @@ end
|
|||
|
||||
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
|
||||
|
||||
mobs:register_mob("mobs_mc:enderman", {
|
||||
mcl_mobs:register_mob("mobs_mc:enderman", {
|
||||
description = S("Enderman"),
|
||||
type = "monster",
|
||||
spawn_class = "passive",
|
||||
|
@ -218,7 +249,7 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
damage = 7,
|
||||
reach = 2,
|
||||
drops = {
|
||||
{name = mobs_mc.items.ender_pearl,
|
||||
{name = "mcl_throwing:ender_pearl",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 1,
|
||||
|
@ -388,7 +419,7 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
self._take_place_timer = 0
|
||||
self._next_take_place_time = math.random(place_frequency_min, place_frequency_max)
|
||||
local pos = self.object:get_pos()
|
||||
local takable_nodes = minetest.find_nodes_in_area_under_air({x=pos.x-2, y=pos.y-1, z=pos.z-2}, {x=pos.x+2, y=pos.y+1, z=pos.z+2}, mobs_mc.enderman_takable)
|
||||
local takable_nodes = minetest.find_nodes_in_area_under_air({x=pos.x-2, y=pos.y-1, z=pos.z-2}, {x=pos.x+2, y=pos.y+1, z=pos.z+2}, "group:enderman_takable")
|
||||
if #takable_nodes >= 1 then
|
||||
local r = pr:next(1, #takable_nodes)
|
||||
local take_pos = takable_nodes[r]
|
||||
|
@ -398,11 +429,7 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
minetest.remove_node(take_pos)
|
||||
local dug = minetest.get_node_or_nil(take_pos)
|
||||
if dug and dug.name == "air" then
|
||||
if mobs_mc.enderman_replace_on_take[node.name] then
|
||||
self._taken_node = mobs_mc.enderman_replace_on_take[node.name]
|
||||
else
|
||||
self._taken_node = node.name
|
||||
end
|
||||
self._taken_node = node.name
|
||||
local def = minetest.registered_nodes[self._taken_node]
|
||||
-- Update animation and texture accordingly (adds visibly carried block)
|
||||
local block_type
|
||||
|
@ -431,7 +458,7 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
self.base_texture = create_enderman_textures(block_type, self._taken_node)
|
||||
self.object:set_properties({ textures = self.base_texture })
|
||||
self.animation = select_enderman_animation("block")
|
||||
mobs:set_animation(self, self.animation.current)
|
||||
mcl_mobs:set_animation(self, self.animation.current)
|
||||
if def.sounds and def.sounds.dug then
|
||||
minetest.sound_play(def.sounds.dug, {pos = take_pos, max_hear_distance = 16}, true)
|
||||
end
|
||||
|
@ -454,7 +481,7 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
local def = minetest.registered_nodes[self._taken_node]
|
||||
-- Update animation accordingly (removes visible block)
|
||||
self.animation = select_enderman_animation("normal")
|
||||
mobs:set_animation(self, self.animation.current)
|
||||
mcl_mobs:set_animation(self, self.animation.current)
|
||||
if def.sounds and def.sounds.place then
|
||||
minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}, true)
|
||||
end
|
||||
|
@ -565,7 +592,7 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
|
||||
|
||||
-- End spawn
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:enderman",
|
||||
"end",
|
||||
"ground",
|
||||
|
@ -577,10 +604,10 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
3000,
|
||||
12,
|
||||
mobs_mc.spawn_height.end_min,
|
||||
mobs_mc.spawn_height.end_max)
|
||||
mcl_vars.mg_end_min,
|
||||
mcl_vars.mg_end_max)
|
||||
-- Overworld spawn
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:enderman",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -730,11 +757,11 @@ mobs:spawn_specific(
|
|||
30,
|
||||
19000,
|
||||
2,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- Nether spawn (rare)
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:enderman",
|
||||
"nether",
|
||||
"ground",
|
||||
|
@ -746,8 +773,8 @@ mobs:spawn_specific(
|
|||
30,
|
||||
27500,
|
||||
4,
|
||||
mobs_mc.spawn_height.nether_min,
|
||||
mobs_mc.spawn_height.nether_max)
|
||||
mcl_vars.mg_nether_min,
|
||||
mcl_vars.mg_nether_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:enderman", S("Enderman"), "mobs_mc_spawn_icon_enderman.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:enderman", S("Enderman"), "mobs_mc_spawn_icon_enderman.png", 0)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
mobs:register_mob("mobs_mc:endermite", {
|
||||
mcl_mobs:register_mob("mobs_mc:endermite", {
|
||||
description = S("Endermite"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -38,4 +38,4 @@ mobs:register_mob("mobs_mc:endermite", {
|
|||
reach = 1,
|
||||
})
|
||||
|
||||
mobs:register_egg("mobs_mc:endermite", S("Endermite"), "mobs_mc_spawn_icon_endermite.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:endermite", S("Endermite"), "mobs_mc_spawn_icon_endermite.png", 0)
|
||||
|
|
|
@ -1,59 +0,0 @@
|
|||
# Game integration help
|
||||
|
||||
This mod has been designed to make game integration rather easy. Ideally, it should be possible to include this mod verbatim in your game, with modifications only done by an external mod.
|
||||
|
||||
To integrate this mod in a game, you have to do 2 things: Adding the mod, and adding another mod which tells `mobs_mc` which items to use. The idea is that `mobs_mc` should work with any items. Specifically, these are the steps you need to follow:
|
||||
|
||||
* Add the `mobs_mc` mod and its dependencies
|
||||
* Add a mod with name “`mobs_mc_gameconfig`”
|
||||
* In this mod, do this:
|
||||
* Do *not* depend on `mobs_mc`
|
||||
* Create the table `mobs_mc`
|
||||
* Create the table `mobs_mc.override`
|
||||
* In `mobs_mc.override`, create subtables (`items`, `spawn`, etc.) like in `0_gameconfig.lua`, defining the na
|
||||
* Read `0_gameconfig.lua` to see which items you can override (and more explanations)
|
||||
* In `on_construct` of a pumpkin or jack'o lantern node, call:
|
||||
* `mobs_mc.tools.check_iron_golem_summon(pos)`
|
||||
* `mobs_mc.tools.check_snow_golem_summon(pos)`
|
||||
* For more information, see `snowman.lua` and `iron_golem.lua`
|
||||
|
||||
Some things to note:
|
||||
|
||||
* Every override is optional, but explicitly setting all the item overrides is strongly recommended
|
||||
* `mobs_mc` ships many (but not all) items on its own. If not item name override is set, the `mobs_mc` item is used
|
||||
* You decide whether your game defines its own items, outside of `mobs_mc` or if you let `mobs_mc` do the work.
|
||||
* Make sure to avoid duplicate items!
|
||||
* After finishing this, throughly test this
|
||||
* Without `mobs_mc_gameconfig`, the mod assumes Minetest Game items
|
||||
* `mobs_mc` optionally depends on `mobs_mc_gameconfig`
|
||||
|
||||
## Example `init.lua` in `mobs_mc_gameconfig`
|
||||
```
|
||||
mobs_mc = {}
|
||||
|
||||
mobs_mc.override = {}
|
||||
|
||||
-- Set the item names here
|
||||
mobs_mc.override.items = {
|
||||
blaze_rod = "mcl_mobitems:blaze_rod",
|
||||
blaze_powder = "mcl_mobitems:blaze_powder",
|
||||
chicken_raw = "mcl_mobitems:chicken",
|
||||
-- And so on ...
|
||||
}
|
||||
|
||||
-- Set the “follow” field of mobs (used for attracting mob, feeding and breeding)
|
||||
mobs_mc.override.follow = {
|
||||
chicken = { "mcl_farming:wheat_seeds", "mcl_farming:melon_seeds", "mcl_farming:pumpkin_seeds", "mcl_farming:beetroot_seeds", },
|
||||
horse = { "mcl_core:apple", mobs_mc.override.items.wheat }, -- TODO
|
||||
pig = { "mcl_farming:potato", mobs_mc.override.items.carrot, mobs_mc.override.items.carrot_on_a_stick},
|
||||
-- And so on ...
|
||||
}
|
||||
|
||||
-- Custom spawn nodes
|
||||
mobs_mc.override.spawn = {
|
||||
snow = { "example:snow", "example:snow2" },
|
||||
-- And so on ...
|
||||
}
|
||||
|
||||
-- Take a look at the other possible tables, see 0_gameconfig.lua
|
||||
```
|
|
@ -10,7 +10,7 @@ local S = minetest.get_translator("mobs_mc")
|
|||
--###################
|
||||
|
||||
|
||||
mobs:register_mob("mobs_mc:ghast", {
|
||||
mcl_mobs:register_mob("mobs_mc:ghast", {
|
||||
description = S("Ghast"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -39,8 +39,8 @@ mobs:register_mob("mobs_mc:ghast", {
|
|||
walk_velocity = 1.6,
|
||||
run_velocity = 3.2,
|
||||
drops = {
|
||||
{name = mobs_mc.items.gunpowder, chance = 1, min = 0, max = 2, looting = "common"},
|
||||
{name = mobs_mc.items.ghast_tear, chance = 10/6, min = 0, max = 1, looting = "common", looting_ignore_chance = true},
|
||||
{name = "mcl_mobitems:gunpowder", chance = 1, min = 0, max = 2, looting = "common"},
|
||||
{name = "mcl_mobitems:ghast_tear", chance = 10/6, min = 0, max = 1, looting = "common", looting_ignore_chance = true},
|
||||
},
|
||||
animation = {
|
||||
stand_speed = 50, walk_speed = 50, run_speed = 50,
|
||||
|
@ -76,7 +76,7 @@ mobs:register_mob("mobs_mc:ghast", {
|
|||
})
|
||||
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:ghast",
|
||||
"nether",
|
||||
"ground",
|
||||
|
@ -88,11 +88,11 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
18000,
|
||||
2,
|
||||
mobs_mc.spawn_height.nether_min,
|
||||
mobs_mc.spawn_height.nether_max)
|
||||
mcl_vars.mg_nether_min,
|
||||
mcl_vars.mg_nether_max)
|
||||
|
||||
-- fireball (projectile)
|
||||
mobs:register_arrow("mobs_mc:fireball", {
|
||||
mcl_mobs:register_arrow("mobs_mc:fireball", {
|
||||
visual = "sprite",
|
||||
visual_size = {x = 1, y = 1},
|
||||
textures = {"mcl_fire_fire_charge.png"},
|
||||
|
@ -105,7 +105,7 @@ mobs:register_arrow("mobs_mc:fireball", {
|
|||
full_punch_interval = 1.0,
|
||||
damage_groups = {fleshy = 6},
|
||||
}, nil)
|
||||
mobs:boom(self, self.object:get_pos(), 1, true)
|
||||
mcl_mobs:boom(self, self.object:get_pos(), 1, true)
|
||||
end,
|
||||
|
||||
hit_mob = function(self, mob)
|
||||
|
@ -113,11 +113,11 @@ mobs:register_arrow("mobs_mc:fireball", {
|
|||
full_punch_interval = 1.0,
|
||||
damage_groups = {fleshy = 6},
|
||||
}, nil)
|
||||
mobs:boom(self, self.object:get_pos(), 1, true)
|
||||
mcl_mobs:boom(self, self.object:get_pos(), 1, true)
|
||||
end,
|
||||
|
||||
hit_node = function(self, pos, node)
|
||||
mobs:boom(self, pos, 1, true)
|
||||
mcl_mobs:boom(self, pos, 1, true)
|
||||
end
|
||||
})
|
||||
|
||||
|
@ -125,4 +125,4 @@ mobs:register_arrow("mobs_mc:fireball", {
|
|||
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:ghast", S("Ghast"), "mobs_mc_spawn_icon_ghast.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:ghast", S("Ghast"), "mobs_mc_spawn_icon_ghast.png", 0)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
mobs:register_mob("mobs_mc:guardian", {
|
||||
mcl_mobs:register_mob("mobs_mc:guardian", {
|
||||
description = S("Guardian"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -44,7 +44,7 @@ mobs:register_mob("mobs_mc:guardian", {
|
|||
},
|
||||
drops = {
|
||||
-- Greatly increased amounts of prismarine
|
||||
{name = mobs_mc.items.prismarine_shard,
|
||||
{name = "mcl_ocean:prismarine_shard",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 32,
|
||||
|
@ -53,37 +53,37 @@ mobs:register_mob("mobs_mc:guardian", {
|
|||
|
||||
-- The following drops are approximations
|
||||
-- Fish / prismarine crystal
|
||||
{name = mobs_mc.items.fish_raw,
|
||||
{name = "mcl_fishing:fish_raw",
|
||||
chance = 4,
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "common",},
|
||||
{name = mobs_mc.items.prismarine_crystals,
|
||||
{name = "mcl_ocean:prismarine_crystals",
|
||||
chance = 4,
|
||||
min = 1,
|
||||
max = 2,
|
||||
looting = "common",},
|
||||
|
||||
-- Rare drop: fish
|
||||
{name = mobs_mc.items.fish_raw,
|
||||
{name = "mcl_fishing:fish_raw",
|
||||
chance = 160, -- 2.5% / 4
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "rare",
|
||||
looting_factor = 0.0025,},
|
||||
{name = mobs_mc.items.salmon_raw,
|
||||
{name = "mcl_fishing:salmon_raw",
|
||||
chance = 160,
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "rare",
|
||||
looting_factor = 0.0025,},
|
||||
{name = mobs_mc.items.clownfish_raw,
|
||||
{name = "mcl_fishing:clownfish_raw",
|
||||
chance = 160,
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "rare",
|
||||
looting_factor = 0.0025,},
|
||||
{name = mobs_mc.items.pufferfish_raw,
|
||||
{name = "mcl_fishing:pufferfish_raw",
|
||||
chance = 160,
|
||||
min = 1,
|
||||
max = 1,
|
||||
|
@ -92,14 +92,14 @@ mobs:register_mob("mobs_mc:guardian", {
|
|||
},
|
||||
fly = true,
|
||||
makes_footstep_sound = false,
|
||||
fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source },
|
||||
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
|
||||
jump = false,
|
||||
view_range = 16,
|
||||
})
|
||||
|
||||
-- Spawning disabled due to size issues
|
||||
-- TODO: Re-enable spawning
|
||||
--mobs:spawn_specific("mobs_mc:guardian", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water - 10)
|
||||
--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
|
||||
mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
mobs:register_mob("mobs_mc:guardian_elder", {
|
||||
mcl_mobs:register_mob("mobs_mc:guardian_elder", {
|
||||
description = S("Elder Guardian"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -49,51 +49,51 @@ mobs:register_mob("mobs_mc:guardian_elder", {
|
|||
-- TODO: Reduce # of drops when ocean monument is ready.
|
||||
|
||||
-- Greatly increased amounts of prismarine
|
||||
{name = mobs_mc.items.prismarine_shard,
|
||||
{name = "mcl_ocean:prismarine_shard",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 64,
|
||||
looting = "common",},
|
||||
|
||||
-- TODO: Only drop if killed by player
|
||||
{name = mobs_mc.items.wet_sponge,
|
||||
{name = "mcl_sponges:sponge_wet",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,},
|
||||
|
||||
-- The following drops are approximations
|
||||
-- Fish / prismarine crystal
|
||||
{name = mobs_mc.items.fish_raw,
|
||||
{name = "mcl_fishing:fish_raw",
|
||||
chance = 4,
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "common",},
|
||||
{name = mobs_mc.items.prismarine_crystals,
|
||||
{name = "mcl_ocean:prismarine_crystals",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 10,
|
||||
looting = "common",},
|
||||
|
||||
-- Rare drop: fish
|
||||
{name = mobs_mc.items.fish_raw,
|
||||
{name = "mcl_fishing:fish_raw",
|
||||
chance = 160, -- 2.5% / 4
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "rare",
|
||||
looting_factor = 0.01 / 4,},
|
||||
{name = mobs_mc.items.salmon_raw,
|
||||
{name = "mcl_fishing:salmon_raw",
|
||||
chance = 160,
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "rare",
|
||||
looting_factor = 0.01 / 4,},
|
||||
{name = mobs_mc.items.clownfish_raw,
|
||||
{name = "mcl_fishing:clownfish_raw",
|
||||
chance = 160,
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "rare",
|
||||
looting_factor = 0.01 / 4,},
|
||||
{name = mobs_mc.items.pufferfish_raw,
|
||||
{name = "mcl_fishing:pufferfish_raw",
|
||||
chance = 160,
|
||||
min = 1,
|
||||
max = 1,
|
||||
|
@ -102,15 +102,15 @@ mobs:register_mob("mobs_mc:guardian_elder", {
|
|||
},
|
||||
fly = true,
|
||||
makes_footstep_sound = false,
|
||||
fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source },
|
||||
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
|
||||
jump = false,
|
||||
view_range = 16,
|
||||
})
|
||||
|
||||
-- Spawning disabled due to size issues <- what do you mean? -j4i
|
||||
-- TODO: Re-enable spawning
|
||||
-- mobs:spawn_specific("mobs_mc:guardian_elder", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-18)
|
||||
-- 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
|
||||
mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0)
|
||||
|
||||
|
|
|
@ -114,7 +114,14 @@ local horse = {
|
|||
fly = false,
|
||||
walk_chance = 60,
|
||||
view_range = 16,
|
||||
follow = mobs_mc.follow.horse,
|
||||
follow = {
|
||||
"mcl_core:apple",
|
||||
"mcl_core:sugar",
|
||||
"mcl_farming:wheat_item",
|
||||
"mcl_farming:hay_block",
|
||||
"mcl_core:apple_gold",
|
||||
"mcl_farming:carrot_item_gold",
|
||||
},
|
||||
passive = true,
|
||||
hp_min = 15,
|
||||
hp_max = 30,
|
||||
|
@ -125,7 +132,7 @@ local horse = {
|
|||
jump = true,
|
||||
jump_height = 5.75, -- can clear 2.5 blocks
|
||||
drops = {
|
||||
{name = mobs_mc.items.leather,
|
||||
{name = "mcl_mobitems:leather",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
|
@ -161,7 +168,7 @@ local horse = {
|
|||
-- Some weird human is riding. Buck them off?
|
||||
if self.driver and not self.tamed and self.buck_off_time <= 0 then
|
||||
if math.random() < 0.2 then
|
||||
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
-- TODO bucking animation
|
||||
else
|
||||
-- Nah, can't be bothered. Think about it again in one second
|
||||
|
@ -182,7 +189,7 @@ local horse = {
|
|||
-- if driver present and horse has a saddle allow control of horse
|
||||
if self.driver and self._saddle then
|
||||
|
||||
mobs.drive(self, "walk", "stand", false, dtime)
|
||||
mcl_mobs.drive(self, "walk", "stand", false, dtime)
|
||||
|
||||
return false -- skip rest of mob functions
|
||||
end
|
||||
|
@ -194,11 +201,11 @@ local horse = {
|
|||
|
||||
-- drop saddle when horse is killed while riding
|
||||
if self._saddle then
|
||||
minetest.add_item(pos, mobs_mc.items.saddle)
|
||||
minetest.add_item(pos, "mcl_mobitems:saddle")
|
||||
end
|
||||
-- also detach from horse properly
|
||||
if self.driver then
|
||||
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
end
|
||||
|
||||
end,
|
||||
|
@ -222,20 +229,20 @@ local horse = {
|
|||
|
||||
-- Feeding, intentionally not using mobs:feed_tame because horse taming is
|
||||
-- different and more complicated
|
||||
if (iname == mobs_mc.items.sugar) then
|
||||
if (iname == "mcl_core:sugar") then
|
||||
temper_increase = 3
|
||||
elseif (iname == mobs_mc.items.wheat) then
|
||||
elseif (iname == "mcl_farming:wheat_item") then
|
||||
temper_increase = 3
|
||||
elseif (iname == mobs_mc.items.apple) then
|
||||
elseif (iname == "mcl_core:apple") then
|
||||
temper_increase = 3
|
||||
elseif (iname == mobs_mc.items.golden_carrot) then
|
||||
elseif (iname == "mcl_farming:carrot_item_gold") then
|
||||
temper_increase = 5
|
||||
elseif (iname == mobs_mc.items.golden_apple) then
|
||||
elseif (iname == "mcl_core:apple_gold") then
|
||||
temper_increase = 10
|
||||
-- Trying to ride
|
||||
elseif not self.driver then
|
||||
self.object:set_properties({stepheight = 1.1})
|
||||
mobs.attach(self, clicker)
|
||||
mcl_mobs.attach(self, clicker)
|
||||
self.buck_off_time = 40 -- TODO how long does it take in minecraft?
|
||||
if self.temper > 100 then
|
||||
self.tamed = true -- NOTE taming can only be finished by riding the horse
|
||||
|
@ -247,7 +254,7 @@ local horse = {
|
|||
|
||||
-- Clicking on the horse while riding ==> unmount
|
||||
elseif self.driver and self.driver == clicker then
|
||||
mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||
mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||
end
|
||||
|
||||
-- If nothing happened temper_increase = 0 and addition does nothing
|
||||
|
@ -258,31 +265,31 @@ local horse = {
|
|||
|
||||
if can_breed(self.name) then
|
||||
-- Breed horse with golden apple or golden carrot
|
||||
if (iname == mobs_mc.items.golden_apple) then
|
||||
if (iname == "mcl_core:apple_gold") then
|
||||
heal = 10
|
||||
elseif (iname == mobs_mc.items.golden_carrot) then
|
||||
elseif (iname == "mcl_farming:carrot_item_gold") then
|
||||
heal = 4
|
||||
end
|
||||
if heal > 0 and mobs:feed_tame(self, clicker, heal, true, false) then
|
||||
if heal > 0 and mcl_mobs:feed_tame(self, clicker, heal, true, false) then
|
||||
return
|
||||
end
|
||||
end
|
||||
-- Feed with anything else
|
||||
-- TODO heal amounts don't work
|
||||
if (iname == mobs_mc.items.sugar) then
|
||||
if (iname == "mcl_core:sugar") then
|
||||
heal = 1
|
||||
elseif (iname == mobs_mc.items.wheat) then
|
||||
elseif (iname == "mcl_farming:wheat_item") then
|
||||
heal = 2
|
||||
elseif (iname == mobs_mc.items.apple) then
|
||||
elseif (iname == "mcl_core:apple") then
|
||||
heal = 3
|
||||
elseif (iname == mobs_mc.items.hay_bale) then
|
||||
elseif (iname == "mcl_farming:hay_block") then
|
||||
heal = 20
|
||||
end
|
||||
if heal > 0 and mobs:feed_tame(self, clicker, heal, false, false) then
|
||||
if heal > 0 and mcl_mobs:feed_tame(self, clicker, heal, false, false) then
|
||||
return
|
||||
end
|
||||
|
||||
if mobs:protect(self, clicker) then
|
||||
if mcl_mobs:protect(self, clicker) then
|
||||
return
|
||||
end
|
||||
|
||||
|
@ -294,11 +301,11 @@ local horse = {
|
|||
-- detatch player already riding horse
|
||||
if self.driver and clicker == self.driver then
|
||||
|
||||
mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||
mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||
|
||||
-- Put on saddle if tamed
|
||||
elseif not self.driver and not self._saddle
|
||||
and iname == mobs_mc.items.saddle then
|
||||
and iname == "mcl_mobitems:saddle" then
|
||||
|
||||
-- Put on saddle and take saddle from player's inventory
|
||||
local w = clicker:get_wielded_item()
|
||||
|
@ -355,18 +362,18 @@ local horse = {
|
|||
elseif not self.driver and self._saddle then
|
||||
|
||||
self.object:set_properties({stepheight = 1.1})
|
||||
mobs.attach(self, clicker)
|
||||
mcl_mobs.attach(self, clicker)
|
||||
|
||||
-- Used to capture horse
|
||||
elseif not self.driver and iname ~= "" then
|
||||
mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
on_breed = function(parent1, parent2)
|
||||
local pos = parent1.object:get_pos()
|
||||
local child = mobs:spawn_child(pos, parent1.name)
|
||||
local child = mcl_mobs:spawn_child(pos, parent1.name)
|
||||
if child then
|
||||
local ent_c = child:get_luaentity()
|
||||
local p = math.random(1, 2)
|
||||
|
@ -415,7 +422,7 @@ local horse = {
|
|||
end,
|
||||
}
|
||||
|
||||
mobs:register_mob("mobs_mc:horse", horse)
|
||||
mcl_mobs:register_mob("mobs_mc:horse", horse)
|
||||
|
||||
-- Skeleton horse
|
||||
local skeleton_horse = table.copy(horse)
|
||||
|
@ -424,7 +431,7 @@ skeleton_horse.breath_max = -1
|
|||
skeleton_horse.armor = {undead = 100, fleshy = 100}
|
||||
skeleton_horse.textures = {{"blank.png", "mobs_mc_horse_skeleton.png", "blank.png"}}
|
||||
skeleton_horse.drops = {
|
||||
{name = mobs_mc.items.bone,
|
||||
{name = "mcl_mobitems:bone",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,},
|
||||
|
@ -438,7 +445,7 @@ skeleton_horse.sounds = {
|
|||
distance = 16,
|
||||
}
|
||||
skeleton_horse.harmed_by_heal = true
|
||||
mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse)
|
||||
mcl_mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse)
|
||||
|
||||
-- Zombie horse
|
||||
local zombie_horse = table.copy(horse)
|
||||
|
@ -447,7 +454,7 @@ zombie_horse.breath_max = -1
|
|||
zombie_horse.armor = {undead = 100, fleshy = 100}
|
||||
zombie_horse.textures = {{"blank.png", "mobs_mc_horse_zombie.png", "blank.png"}}
|
||||
zombie_horse.drops = {
|
||||
{name = mobs_mc.items.rotten_flesh,
|
||||
{name = "mcl_mobitems:rotten_flesh",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,},
|
||||
|
@ -462,7 +469,7 @@ zombie_horse.sounds = {
|
|||
distance = 16,
|
||||
}
|
||||
zombie_horse.harmed_by_heal = true
|
||||
mobs:register_mob("mobs_mc:zombie_horse", zombie_horse)
|
||||
mcl_mobs:register_mob("mobs_mc:zombie_horse", zombie_horse)
|
||||
|
||||
-- Donkey
|
||||
local d = 0.86 -- donkey scale
|
||||
|
@ -493,7 +500,7 @@ donkey.collisionbox = {
|
|||
donkey.jump = true
|
||||
donkey.jump_height = 3.75 -- can clear 1 block height
|
||||
|
||||
mobs:register_mob("mobs_mc:donkey", donkey)
|
||||
mcl_mobs:register_mob("mobs_mc:donkey", donkey)
|
||||
|
||||
-- Mule
|
||||
local m = 0.94
|
||||
|
@ -511,11 +518,11 @@ mule.collisionbox = {
|
|||
horse.collisionbox[5] * m,
|
||||
horse.collisionbox[6] * m,
|
||||
}
|
||||
mobs:register_mob("mobs_mc:mule", mule)
|
||||
mcl_mobs:register_mob("mobs_mc:mule", mule)
|
||||
|
||||
--===========================
|
||||
--Spawn Function
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:horse",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -562,11 +569,11 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
15000,
|
||||
4,
|
||||
mobs_mc.spawn_height.water+3,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mobs_mc.water_level+3,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:donkey",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -583,12 +590,12 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
15000,
|
||||
4,
|
||||
mobs_mc.spawn_height.water+3,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mobs_mc.water_level+3,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:horse", S("Horse"), "mobs_mc_spawn_icon_horse.png", 0)
|
||||
mobs:register_egg("mobs_mc:skeleton_horse", S("Skeleton Horse"), "mobs_mc_spawn_icon_horse_skeleton.png", 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)
|
||||
mobs:register_egg("mobs_mc:donkey", S("Donkey"), "mobs_mc_spawn_icon_donkey.png", 0)
|
||||
mobs:register_egg("mobs_mc:mule", S("Mule"), "mobs_mc_spawn_icon_mule.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)
|
||||
|
|
|
@ -2,45 +2,100 @@
|
|||
--maikerumine
|
||||
--made for MC like Survival game
|
||||
--License for code WTFPL and otherwise stated in readmes
|
||||
mobs_mc = {}
|
||||
|
||||
local path = minetest.get_modpath("mobs_mc")
|
||||
local pr = PseudoRandom(os.time()*5)
|
||||
|
||||
if not minetest.get_modpath("mobs_mc_gameconfig") then
|
||||
mobs_mc = {}
|
||||
local offsets = {}
|
||||
for x=-2, 2 do
|
||||
for z=-2, 2 do
|
||||
table.insert(offsets, {x=x, y=0, z=z})
|
||||
end
|
||||
end
|
||||
|
||||
-- For utility functions
|
||||
mobs_mc.tools = {}
|
||||
--[[ Periodically check and teleport mob to owner if not sitting (order ~= "sit") and
|
||||
the owner is too far away. To be used with do_custom. Note: Optimized for mobs smaller than 1×1×1.
|
||||
Larger mobs might have space problems after teleportation.
|
||||
|
||||
-- This function checks if the item ID has been overwritten and returns true if it is unchanged
|
||||
if minetest.get_modpath("mobs_mc_gameconfig") and mobs_mc.override and mobs_mc.override.items then
|
||||
mobs_mc.is_item_variable_overridden = function(id)
|
||||
return mobs_mc.override.items[id] == nil
|
||||
* dist: Minimum required distance from owner to teleport. Default: 12
|
||||
* teleport_check_interval: Optional. Interval in seconds to check the mob teleportation. Default: 4 ]]
|
||||
mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval)
|
||||
return function(self, dtime)
|
||||
-- No teleportation if no owner or if sitting
|
||||
if not self.owner or self.order == "sit" then
|
||||
return
|
||||
end
|
||||
if not teleport_check_interval then
|
||||
teleport_check_interval = 4
|
||||
end
|
||||
if not dist then
|
||||
dist = 12
|
||||
end
|
||||
if self._teleport_timer == nil then
|
||||
self._teleport_timer = teleport_check_interval
|
||||
return
|
||||
end
|
||||
self._teleport_timer = self._teleport_timer - dtime
|
||||
if self._teleport_timer <= 0 then
|
||||
self._teleport_timer = teleport_check_interval
|
||||
local mob_pos = self.object:get_pos()
|
||||
local owner = minetest.get_player_by_name(self.owner)
|
||||
if not owner then
|
||||
-- No owner found, no teleportation
|
||||
return
|
||||
end
|
||||
local owner_pos = owner:get_pos()
|
||||
local dist_from_owner = vector.distance(owner_pos, mob_pos)
|
||||
if dist_from_owner > dist then
|
||||
-- Check for nodes below air in a 5×1×5 area around the owner position
|
||||
local check_offsets = table.copy(offsets)
|
||||
-- Attempt to place mob near player. Must be placed on walkable node below a non-walkable one. Place inside that air node.
|
||||
while #check_offsets > 0 do
|
||||
local r = pr:next(1, #check_offsets)
|
||||
local telepos = vector.add(owner_pos, check_offsets[r])
|
||||
local telepos_below = {x=telepos.x, y=telepos.y-1, z=telepos.z}
|
||||
table.remove(check_offsets, r)
|
||||
-- Long story short, spawn on a platform
|
||||
local trynode = minetest.registered_nodes[minetest.get_node(telepos).name]
|
||||
local trybelownode = minetest.registered_nodes[minetest.get_node(telepos_below).name]
|
||||
if trynode and not trynode.walkable and
|
||||
trybelownode and trybelownode.walkable then
|
||||
-- Correct position found! Let's teleport.
|
||||
self.object:set_pos(telepos)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
-- No items are overwritten, so always return true
|
||||
mobs_mc.is_item_variable_overridden = function(id)
|
||||
end
|
||||
|
||||
local function is_forbidden_node(pos, node)
|
||||
node = node or minetest.get_node(pos)
|
||||
return minetest.get_item_group(node.name, "stair") > 0 or minetest.get_item_group(node.name, "slab") > 0 or minetest.get_item_group(node.name, "carpet") > 0
|
||||
end
|
||||
|
||||
function mcl_mobs:spawn_abm_check(pos, node, name)
|
||||
-- Don't spawn monsters on mycelium
|
||||
if (node.name == "mcl_core:mycelium" or node.name == "mcl_core:mycelium_snow") and minetest.registered_entities[name].type == "monster" then
|
||||
return true
|
||||
--Don't Spawn mobs on stairs, slabs, or carpets
|
||||
elseif is_forbidden_node(pos, node) or is_forbidden_node(vector.add(pos, vector.new(0, 1, 0))) then
|
||||
return true
|
||||
-- Spawn on opaque or liquid nodes
|
||||
elseif minetest.get_item_group(node.name, "opaque") ~= 0 or minetest.registered_nodes[node.name].liquidtype ~= "none" or node.name == "mcl_core:grass_path" then
|
||||
return false
|
||||
end
|
||||
|
||||
-- Reject everything else
|
||||
return true
|
||||
end
|
||||
|
||||
--MOB ITEMS SELECTOR SWITCH
|
||||
dofile(path .. "/0_gameconfig.lua")
|
||||
--Items
|
||||
dofile(path .. "/1_items_default.lua")
|
||||
|
||||
-- Bow, arrow and throwables
|
||||
dofile(path .. "/2_throwing.lua")
|
||||
|
||||
-- Shared functions
|
||||
dofile(path .. "/3_shared.lua")
|
||||
|
||||
--Mob heads
|
||||
dofile(path .. "/4_heads.lua")
|
||||
|
||||
dofile(path .. "/5_spawn_abm_check.lua")
|
||||
mobs_mc.shears_wear = 276
|
||||
mobs_mc.water_level = tonumber(minetest.settings:get("water_level")) or 0
|
||||
|
||||
-- Animals
|
||||
local path = minetest.get_modpath("mobs_mc")
|
||||
dofile(path .. "/bat.lua") -- Mesh and animation by toby109tt / https://github.com/22i
|
||||
dofile(path .. "/rabbit.lua") -- Mesh and animation byExeterDad
|
||||
dofile(path .. "/chicken.lua") -- Mesh and animation by Pavel_S
|
||||
|
@ -57,8 +112,6 @@ dofile(path .. "/squid.lua") -- Animation, sound and egg texture by daufinsyd
|
|||
|
||||
-- NPCs
|
||||
dofile(path .. "/villager.lua") -- KrupnoPavel Mesh and animation by toby109tt / https://github.com/22i
|
||||
-- Agent texture missing
|
||||
--dofile(path .. "/agent.lua") -- Mesh and animation by toby109tt / https://github.com/22i
|
||||
|
||||
-- Illagers and witch
|
||||
dofile(path .. "/villager_evoker.lua") -- Mesh and animation by toby109tt / https://github.com/22i
|
||||
|
@ -89,12 +142,3 @@ dofile(path .. "/slime+magma_cube.lua") -- Wuzzy
|
|||
dofile(path .. "/spider.lua") -- Spider by AspireMint (fishyWET (CC-BY-SA 3.0 license for texture)
|
||||
dofile(path .. "/vex.lua") -- KrupnoPavel
|
||||
dofile(path .. "/wither.lua") -- Mesh and animation by toby109tt / https://github.com/22i
|
||||
--NOTES:
|
||||
--
|
||||
--[[
|
||||
COLISIONBOX in minetest press f5 to see where you are looking at then put these wool collor nodes on the ground in direction of north/east/west... to make colisionbox editing easier
|
||||
#1west-pink/#2down/#3south-blue/#4east-red/#5up/#6north-yelow
|
||||
{-1, -0.5, -1, 1, 3, 1}, Right, Bottom, Back, Left, Top, Front
|
||||
--]]
|
||||
--
|
||||
--
|
||||
|
|
|
@ -9,9 +9,9 @@ local S = minetest.get_translator("mobs_mc")
|
|||
--################### IRON GOLEM
|
||||
--###################
|
||||
|
||||
local etime = 0
|
||||
|
||||
|
||||
mobs:register_mob("mobs_mc:iron_golem", {
|
||||
mcl_mobs:register_mob("mobs_mc:iron_golem", {
|
||||
description = S("Iron Golem"),
|
||||
type = "npc",
|
||||
spawn_class = "passive",
|
||||
|
@ -41,12 +41,32 @@ mobs:register_mob("mobs_mc:iron_golem", {
|
|||
group_attack = true,
|
||||
attacks_monsters = true,
|
||||
attack_type = "dogfight",
|
||||
_got_poppy = false,
|
||||
pick_up = {"mcl_flowers:poppy"},
|
||||
on_pick_up = function(self,n)
|
||||
if n.itemstring:find("mcl_flowers:poppy") then
|
||||
if not self._got_poppy then
|
||||
self._got_poppy=true
|
||||
return
|
||||
end
|
||||
return true
|
||||
end
|
||||
end,
|
||||
replace_what = {"mcl_flowers:poppy"},
|
||||
replace_with = {"air"},
|
||||
on_replace = function(self, pos, oldnode, newnode)
|
||||
if not self.got_poppy and oldnode.name == "mcl_flowers:poppy" then
|
||||
self._got_poppy=true
|
||||
return
|
||||
end
|
||||
return false
|
||||
end,
|
||||
drops = {
|
||||
{name = mobs_mc.items.iron_ingot,
|
||||
{name = "mcl_core:iron_ingot",
|
||||
chance = 1,
|
||||
min = 3,
|
||||
max = 5,},
|
||||
{name = mobs_mc.items.poppy,
|
||||
{name = "mcl_flowers:poppy",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,},
|
||||
|
@ -60,11 +80,19 @@ mobs:register_mob("mobs_mc:iron_golem", {
|
|||
punch_start = 40, punch_end = 50,
|
||||
},
|
||||
jump = true,
|
||||
on_step = function(self,dtime)
|
||||
etime = etime + dtime
|
||||
if etime > 10 then
|
||||
if self._home and vector.distance(self._home,self.object:get_pos()) > 50 then
|
||||
mcl_mobs:gopath(self,self._home)
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:iron_golem", S("Iron Golem"), "mobs_mc_spawn_icon_iron_golem.png", 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.
|
||||
|
@ -79,7 +107,7 @@ I = Iron block
|
|||
. = Air
|
||||
]]
|
||||
|
||||
mobs_mc.tools.check_iron_golem_summon = function(pos)
|
||||
function mobs_mc.check_iron_golem_summon(pos)
|
||||
local checks = {
|
||||
-- These are the possible placement patterns, with offset from the pumpkin block.
|
||||
-- These tables include the positions of the iron blocks (1-4) and air blocks (5-8)
|
||||
|
@ -137,7 +165,7 @@ mobs_mc.tools.check_iron_golem_summon = function(pos)
|
|||
for i=1, 4 do
|
||||
local cpos = vector.add(pos, checks[c][i])
|
||||
local node = minetest.get_node(cpos)
|
||||
if node.name ~= mobs_mc.items.iron_block then
|
||||
if node.name ~= "mcl_core:ironblock" then
|
||||
ok = false
|
||||
break
|
||||
end
|
||||
|
|
|
@ -24,7 +24,7 @@ local carpets = {
|
|||
unicolor_light_blue = { "mcl_wool:light_blue_carpet", "light_blue" },
|
||||
}
|
||||
|
||||
mobs:register_mob("mobs_mc:llama", {
|
||||
mcl_mobs:register_mob("mobs_mc:llama", {
|
||||
description = S("Llama"),
|
||||
type = "animal",
|
||||
spawn_class = "passive",
|
||||
|
@ -42,7 +42,6 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
{"blank.png", "blank.png", "mobs_mc_llama_gray.png"},
|
||||
{"blank.png", "blank.png", "mobs_mc_llama_white.png"},
|
||||
{"blank.png", "blank.png", "mobs_mc_llama.png"},
|
||||
-- TODO: Add llama carpet textures (Pixel Perfection seems to use verbatim copy from Minecraft :-( )
|
||||
},
|
||||
visual_size = {x=3, y=3},
|
||||
makes_footstep_sound = true,
|
||||
|
@ -52,7 +51,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
follow_velocity = 4.4,
|
||||
floats = 1,
|
||||
drops = {
|
||||
{name = mobs_mc.items.leather,
|
||||
{name = "mcl_mobitems:leather",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
|
@ -83,7 +82,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
look_start = 78,
|
||||
look_end = 108,
|
||||
},
|
||||
follow = mobs_mc.follow.llama,
|
||||
follow = { "mcl_farming:wheat_item", "mcl_farming:hay_block" },
|
||||
view_range = 16,
|
||||
do_custom = function(self, dtime)
|
||||
|
||||
|
@ -102,7 +101,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
-- if driver present allow control of llama
|
||||
if self.driver then
|
||||
|
||||
mobs.drive(self, "walk", "stand", false, dtime)
|
||||
mcl_mobs.drive(self, "walk", "stand", false, dtime)
|
||||
|
||||
return false -- skip rest of mob functions
|
||||
end
|
||||
|
@ -114,7 +113,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
|
||||
-- detach from llama properly
|
||||
if self.driver then
|
||||
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
end
|
||||
|
||||
end,
|
||||
|
@ -127,71 +126,67 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
end
|
||||
|
||||
local item = clicker:get_wielded_item()
|
||||
if item:get_name() == mobs_mc.items.hay_bale then
|
||||
if item:get_name() == "mcl_farming:hay_block" then
|
||||
-- Breed with hay bale
|
||||
if mobs:feed_tame(self, clicker, 1, true, false) then return end
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end
|
||||
else
|
||||
-- Feed with anything else
|
||||
if mobs:feed_tame(self, clicker, 1, false, true) then return end
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, false, true) then return end
|
||||
end
|
||||
if mobs:protect(self, clicker) then return end
|
||||
if mcl_mobs:protect(self, clicker) then return end
|
||||
|
||||
-- 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
|
||||
--[[ TODO: Re-enable this code when carpet textures arrived.
|
||||
if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then
|
||||
for group, carpetdata in pairs(carpets) do
|
||||
if minetest.get_item_group(item:get_name(), group) == 1 then
|
||||
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 = mobs_mc.items.leather,
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,},
|
||||
{name = item:get_name(),
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,},
|
||||
}
|
||||
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
|
||||
-- detatch player already riding llama
|
||||
if self.driver and clicker == self.driver then
|
||||
|
||||
mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||
mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||
|
||||
-- attach player to llama
|
||||
elseif not self.driver then
|
||||
-- attach player to llama
|
||||
elseif not self.driver then
|
||||
|
||||
self.object:set_properties({stepheight = 1.1})
|
||||
mobs.attach(self, clicker)
|
||||
end
|
||||
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
|
||||
mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
end
|
||||
end,
|
||||
|
||||
--[[
|
||||
TODO: Enable this code when carpet textures arrived.
|
||||
on_breed = function(parent1, parent2)
|
||||
-- When breeding, make sure the child has no carpet
|
||||
local pos = parent1.object:get_pos()
|
||||
|
@ -201,7 +196,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
else
|
||||
parent = parent2
|
||||
end
|
||||
child = mobs:spawn_child(pos, parent.name)
|
||||
child = mcl_mobs:spawn_child(pos, parent.name)
|
||||
if child then
|
||||
local ent_c = child:get_luaentity()
|
||||
ent_c.base_texture = table.copy(ent_c.base_texture)
|
||||
|
@ -213,12 +208,11 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
return false
|
||||
end
|
||||
end,
|
||||
]]
|
||||
|
||||
})
|
||||
|
||||
--spawn
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:llama",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -241,8 +235,8 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
15000,
|
||||
5,
|
||||
mobs_mc.spawn_height.water+15,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mobs_mc.water_level+15,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0)
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
# textdomain: mobs_mc
|
||||
Totem of Undying=Totem der Unsterblichkeit
|
||||
A totem of undying is a rare artifact which may safe you from certain death.=Ein Totem der Unsterblichkeit ist ein seltenes Artefakt, dass Sie vor dem sicheren Tod bewahren kann.
|
||||
The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Der Totem funktioniert nur, während Sie ihn halten. Wenn Sie normalerweise tödlich hohen Schaden erhalten, werden Sie vor dem Tod bewahrt und Sie erhalten eine zweite Chance mit 1 TP. Der Totem wird dabei zerstört.
|
||||
Agent=Akteur
|
||||
Bat=Fledermaus
|
||||
Blaze=Lohe
|
||||
|
@ -52,13 +49,6 @@ Wolf=Wolf
|
|||
Husk=Wüstenzombie
|
||||
Zombie=Zombie
|
||||
Zombie Pigman=Schweinezombie
|
||||
Iron Horse Armor=Eisenpferderüstung
|
||||
Iron horse armor can be worn by horses to increase their protection from harm a bit.=Eine Eisenpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden etwas zu erhöhen.
|
||||
Golden Horse Armor=Goldpferderüstung
|
||||
Golden horse armor can be worn by horses to increase their protection from harm.=Eine Goldpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden zu erhöhen.
|
||||
Diamond Horse Armor=Diamantpferderüstung
|
||||
Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Eine Diamantpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden beträchtlich zu erhöhen.
|
||||
Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Platzieren Sie es auf einem Pferd, um die Pferderüstung aufzusetzen. Esel und Maultiere können keine Pferderüstung tragen.
|
||||
Farmer=Bauer
|
||||
Fisherman=Fischer
|
||||
Fletcher=Pfeilmacher
|
||||
|
@ -72,4 +62,3 @@ Weapon Smith=Waffenschmied
|
|||
Tool Smith=Werkzeugschmied
|
||||
Cleric=Priester
|
||||
Nitwit=Dorftrottel
|
||||
Protects you from death while wielding it=Schützt vor dem Tod, wenn es gehalten wird
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
# textdomain: mobs_mc
|
||||
Totem of Undying=Tótem de la inmortalidad
|
||||
A totem of undying is a rare artifact which may safe you from certain death.=Un tótem de la inmortalidad es un artefacto raro que puede salvarte de una muerte segura.
|
||||
The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=El tótem solo funciona mientras lo sostienes en tu mano. Si recibes un daño crítico, no mueres y obtienes una segunda oportunidad con 1 HP. Sin embargo, el tótem se destruye en el proceso.
|
||||
Agent=Agente
|
||||
Bat=Murciélago
|
||||
Blaze=Blaze
|
||||
|
@ -52,13 +49,6 @@ Wolf=Lobo
|
|||
Husk=Husk
|
||||
Zombie=Zombie
|
||||
Zombie Pigman=Cerdo Zombie
|
||||
Iron Horse Armor=Armadura de hierro para caballo
|
||||
Iron horse armor can be worn by horses to increase their protection from harm a bit.=Los caballos pueden usar armadura de caballo de hierro para aumentar un poco su protección contra el daño.
|
||||
Golden Horse Armor=Armadura de oro para caballo
|
||||
Golden horse armor can be worn by horses to increase their protection from harm.=Los caballos pueden usar armadura de caballo de oro para aumentar su protección contra el daño.
|
||||
Diamond Horse Armor=Armadura de diamante para caballo
|
||||
Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Los caballos pueden usar armadura de caballo de diamante para aumentar en gran medida su protección contra el daño.
|
||||
Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Colóquelo en un caballo para ponerle la armadura de caballo. Los burros y las mulas no pueden usar armadura de caballo.
|
||||
Farmer=Granjero
|
||||
Fisherman=Pescador
|
||||
Fletcher=Flechador
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
# textdomain: mobs_mc
|
||||
Totem of Undying=Totem d'immortalité
|
||||
A totem of undying is a rare artifact which may safe you from certain death.=Un totem d'immortalité est un artefact rare qui peut vous protéger d'une mort certaine.
|
||||
The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Le totem ne fonctionne que lorsque vous le tenez dans votre main. Si vous recevez des dégâts mortels, vous êtes sauvé de la mort et vous obtenez une seconde chance avec 1 HP. Cependant, le totem est détruit.
|
||||
Agent=Agent
|
||||
Bat=Chauve-souris
|
||||
Blaze=Blaze
|
||||
|
@ -52,13 +49,6 @@ Wolf=Loup
|
|||
Husk=Zombie Momifié
|
||||
Zombie=Zombie
|
||||
Zombie Pigman=Zombie Cochon
|
||||
Iron Horse Armor=Armure de cheval en fer
|
||||
Iron horse armor can be worn by horses to increase their protection from harm a bit.=L'armure de cheval en fer peut être portée par les chevaux pour augmenter un peu leur protection contre les dommages.
|
||||
Golden Horse Armor=Armure de cheval en or
|
||||
Golden horse armor can be worn by horses to increase their protection from harm.=Une armure de cheval en or peut être portée par les chevaux pour augmenter leur protection contre les dommages.
|
||||
Diamond Horse Armor=Armure de cheval en diamant
|
||||
Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Une armure de cheval en diament peut être portée par les chevaux pour augmenter fortement leur protection contre les dommages.
|
||||
Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Placez-la sur un cheval pour mettre l'armure de cheval. Les ânes et les mules ne peuvent pas porter d'armure de cheval.
|
||||
Farmer=Fermier
|
||||
Fisherman=Pêcheur
|
||||
Fletcher=Archer
|
||||
|
@ -72,4 +62,3 @@ Weapon Smith=Fabriquant d'arme
|
|||
Tool Smith=Fabriquant d'outil
|
||||
Cleric=Clerc
|
||||
Nitwit=Crétin
|
||||
Protects you from death while wielding it=Vous protège de la mort en la maniant
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
# textdomain: mobs_mc
|
||||
Totem of Undying=Тотем бессмертия
|
||||
A totem of undying is a rare artifact which may safe you from certain death.=Тотем бессмертия это редкий артефакт, способный спасти вас от смерти.
|
||||
The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Тотем работает только когда вы держите его в руке. Если вы получаете смертельный урон, вы спасаетесь от смерти и получаете второй шанс с 1 HP. Однако тотем при этом уничтожается.
|
||||
Agent=Агент
|
||||
Bat=Летучая мышь
|
||||
Blaze=Ифрит
|
||||
|
@ -52,13 +49,6 @@ Wolf=Волк
|
|||
Husk=Кадавр
|
||||
Zombie=Зомби
|
||||
Zombie Pigman=Зомби-свиночеловек
|
||||
Iron Horse Armor=Железные доспехи лошади
|
||||
Iron horse armor can be worn by horses to increase their protection from harm a bit.=Железные доспехи лошади, надетые на лошадь, немного защищают её от вреда.
|
||||
Golden Horse Armor=Золотые доспехи лошади
|
||||
Golden horse armor can be worn by horses to increase their protection from harm.=Золотые доспехи лошади, надетые на лошадь, защищают её от вреда.
|
||||
Diamond Horse Armor=Алмазные доспехи лошади
|
||||
Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Алмазные доспехи лошади, надетые на лошадь, отлично защищают её от вреда.
|
||||
Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Поместите это на лошадь, чтобы одеть лошадь в доспехи. Ослики и мулы не могут носить лошадиные доспехи.
|
||||
Farmer=Фермер
|
||||
Fisherman=Рыбак
|
||||
Fletcher=Лучник
|
||||
|
@ -72,4 +62,3 @@ Weapon Smith=Оружейник
|
|||
Tool Smith=Инструментальщик
|
||||
Cleric=Церковник
|
||||
Nitwit=Нищий
|
||||
Protects you from death while wielding it=Защищает вас от смерти, пока вы владеете им
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
# textdomain: mobs_mc
|
||||
Totem of Undying=
|
||||
A totem of undying is a rare artifact which may safe you from certain death.=
|
||||
The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=
|
||||
Agent=
|
||||
Bat=
|
||||
Blaze=
|
||||
|
@ -52,13 +49,6 @@ Wolf=
|
|||
Husk=
|
||||
Zombie=
|
||||
Zombie Pigman=
|
||||
Iron Horse Armor=
|
||||
Iron horse armor can be worn by horses to increase their protection from harm a bit.=
|
||||
Golden Horse Armor=
|
||||
Golden horse armor can be worn by horses to increase their protection from harm.=
|
||||
Diamond Horse Armor=
|
||||
Diamond horse armor can be worn by horses to greatly increase their protection from harm.=
|
||||
Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=
|
||||
Farmer=
|
||||
Fisherman=
|
||||
Fletcher=
|
||||
|
@ -72,4 +62,3 @@ Weapon Smith=
|
|||
Tool Smith=
|
||||
Cleric=
|
||||
Nitwit=
|
||||
Protects you from death while wielding it=
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
name = mobs_mc
|
||||
author = maikerumine
|
||||
description = Adds Minecraft-like monsters and animals.
|
||||
depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip
|
||||
depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip, mcl_core
|
||||
optional_depends = default, mcl_tnt, mcl_bows, mcl_throwing, mcl_fishing, bones, mesecons_materials, mobs_mc_gameconfig, doc_items
|
||||
|
||||
|
|
|
@ -13,16 +13,15 @@ local pr = PseudoRandom(os.time()*12)
|
|||
|
||||
local default_walk_chance = 70
|
||||
|
||||
-- Returns true if the item is food (taming) for the cat/ocelot
|
||||
local is_food = function(itemstring)
|
||||
for f=1, #mobs_mc.follow.ocelot do
|
||||
if itemstring == mobs_mc.follow.ocelot[f] then
|
||||
return true
|
||||
elseif string.sub(itemstring, 1, 6) == "group:" and minetest.get_item_group(itemstring, string.sub(itemstring, 7, -1)) ~= 0 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
local follow = {
|
||||
"mcl_fishing:fish_raw",
|
||||
"mcl_fishing:salmon_raw",
|
||||
"mcl_fishing:clownfish_raw",
|
||||
"mcl_fishing:pufferfish_raw",
|
||||
}
|
||||
|
||||
local function is_food(itemstring)
|
||||
return table.indexof(follow, itemstring) ~= -1
|
||||
end
|
||||
|
||||
-- Ocelot
|
||||
|
@ -65,7 +64,7 @@ local ocelot = {
|
|||
run_start = 0,
|
||||
run_end = 40,
|
||||
},
|
||||
follow = mobs_mc.follow.ocelot,
|
||||
follow = follow,
|
||||
view_range = 12,
|
||||
passive = true,
|
||||
attack_type = "dogfight",
|
||||
|
@ -99,7 +98,7 @@ local ocelot = {
|
|||
end,
|
||||
}
|
||||
|
||||
mobs:register_mob("mobs_mc:ocelot", ocelot)
|
||||
mcl_mobs:register_mob("mobs_mc:ocelot", ocelot)
|
||||
|
||||
-- Cat
|
||||
local cat = table.copy(ocelot)
|
||||
|
@ -122,9 +121,9 @@ cat.sounds = {
|
|||
distance = 16,
|
||||
}
|
||||
cat.on_rightclick = function(self, clicker)
|
||||
if mobs:feed_tame(self, clicker, 1, true, false) then return end
|
||||
if mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end
|
||||
if mobs:protect(self, clicker) then return end
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end
|
||||
if mcl_mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end
|
||||
if mcl_mobs:protect(self, clicker) then return end
|
||||
|
||||
if self.child then return end
|
||||
|
||||
|
@ -149,13 +148,13 @@ cat.on_rightclick = function(self, clicker)
|
|||
|
||||
end
|
||||
|
||||
mobs:register_mob("mobs_mc:cat", cat)
|
||||
mcl_mobs:register_mob("mobs_mc:cat", cat)
|
||||
|
||||
local base_spawn_chance = 5000
|
||||
|
||||
-- Spawn ocelot
|
||||
--they get the same as the llama because I'm trying to rework so much of this code right now -j4i
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:ocelot",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -170,19 +169,19 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
15000,
|
||||
5,
|
||||
mobs_mc.spawn_height.water+15,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mobs_mc.water_level+15,
|
||||
mcl_vars.mg_overworld_max)
|
||||
--[[
|
||||
mobs:spawn({
|
||||
name = "mobs_mc:ocelot",
|
||||
nodes = mobs_mc.spawn.jungle,
|
||||
nodes = { "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern", "mcl_core:vine" },
|
||||
neighbors = {"air"},
|
||||
light_max = minetest.LIGHT_MAX+1,
|
||||
light_min = 0,
|
||||
chance = math.ceil(base_spawn_chance * 1.5), -- emulates 1/3 spawn failure rate
|
||||
active_object_count = 12,
|
||||
min_height = mobs_mc.spawn_height.water+1, -- Right above ocean level
|
||||
max_height = mobs_mc.spawn_height.overworld_max,
|
||||
min_height = mobs_mc.water_level+1, -- Right above ocean level
|
||||
max_height = mcl_vars.mg_overworld_max,
|
||||
on_spawn = function(self, pos)
|
||||
Note: Minecraft has a 1/3 spawn failure rate.
|
||||
In this mod it is emulated by reducing the spawn rate accordingly (see above).
|
||||
|
@ -232,4 +231,4 @@ mobs:spawn({
|
|||
|
||||
-- spawn eggs
|
||||
-- FIXME: The spawn icon shows a cat texture, not an ocelot texture
|
||||
mobs:register_egg("mobs_mc:ocelot", S("Ocelot"), "mobs_mc_spawn_icon_cat.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:ocelot", S("Ocelot"), "mobs_mc_spawn_icon_cat.png", 0)
|
||||
|
|
|
@ -8,10 +8,76 @@ local S = minetest.get_translator("mobs_mc")
|
|||
--###################
|
||||
--################### PARROT
|
||||
--###################
|
||||
local shoulders = {
|
||||
left = vector.new(-3.75,10.5,0),
|
||||
right = vector.new(3.75,10.5,0)
|
||||
}
|
||||
|
||||
--find a free shoulder or return nil
|
||||
local function get_shoulder(player)
|
||||
local sh = "left"
|
||||
for _,o in pairs(player:get_children()) do
|
||||
local l = o:get_luaentity()
|
||||
if l and l.name == "mobs_mc:parrot" then
|
||||
local _,_,a = l.object:get_attach()
|
||||
for _,s in pairs(shoulders) do
|
||||
if a and vector.equals(a,s) then
|
||||
if sh == "left" then
|
||||
sh = "right"
|
||||
else
|
||||
return
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return shoulders[sh]
|
||||
end
|
||||
|
||||
mobs:register_mob("mobs_mc:parrot", {
|
||||
local function perch(self,player)
|
||||
if self.tamed and player:get_player_name() == self.owner and not self.object:get_attach() then
|
||||
local shoulder = get_shoulder(player)
|
||||
if not shoulder then return true end
|
||||
self.object:set_attach(player,"",shoulder,vector.new(0,0,0),true)
|
||||
mcl_mobs:set_animation(self, "stand")
|
||||
end
|
||||
end
|
||||
|
||||
local function check_perch(self,dtime)
|
||||
if self.object:get_attach() then
|
||||
for _,p in pairs(minetest.get_connected_players()) do
|
||||
for _,o in pairs(p:get_children()) do
|
||||
local l = o:get_luaentity()
|
||||
if l and l.name == "mobs_mc:parrot" then
|
||||
local n1 = minetest.get_node(vector.offset(p:get_pos(),0,-0.6,0)).name
|
||||
local n2 = minetest.get_node(vector.offset(p:get_pos(),0,0,0)).name
|
||||
local n3 = minetest.get_node(vector.offset(p:get_pos(),0,1,0)).name
|
||||
if n1 == "air" or minetest.get_item_group(n2,"water") > 0 or minetest.get_item_group(n2,"lava") > 0 then
|
||||
o:set_detach()
|
||||
self.detach_timer = 0
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif not self.detach_timer then
|
||||
for _,p in pairs(minetest.get_connected_players()) do
|
||||
if vector.distance(self.object:get_pos(),p:get_pos()) < 0.5 then
|
||||
perch(self,p)
|
||||
return
|
||||
end
|
||||
end
|
||||
elseif self.detach_timer then
|
||||
if self.detach_timer > 1 then
|
||||
self.detach_timer = nil
|
||||
else
|
||||
self.detach_timer = self.detach_timer + dtime
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
mcl_mobs:register_mob("mobs_mc:parrot", {
|
||||
description = S("Parrot"),
|
||||
type = "npc",
|
||||
spawn_class = "passive",
|
||||
|
@ -35,22 +101,22 @@ mobs:register_mob("mobs_mc:parrot", {
|
|||
distance = 16,
|
||||
},
|
||||
drops = {
|
||||
{name = mobs_mc.items.feather,
|
||||
{name = "mcl_mobitems:feather",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 2,
|
||||
looting = "common",},
|
||||
},
|
||||
animation = {
|
||||
animation = {
|
||||
stand_speed = 50,
|
||||
walk_speed = 50,
|
||||
fly_speed = 50,
|
||||
stand_start = 30,
|
||||
stand_end = 45,
|
||||
stand_start = 0,
|
||||
stand_end = 0,
|
||||
fly_start = 30,
|
||||
fly_end = 45,
|
||||
walk_start = 30,
|
||||
walk_end = 45,
|
||||
walk_start = 0,
|
||||
walk_end = 20,
|
||||
-- TODO: actual walk animation
|
||||
--walk_start = 0,
|
||||
--walk_end = 20,
|
||||
|
@ -66,12 +132,17 @@ mobs:register_mob("mobs_mc:parrot", {
|
|||
makes_footstep_sound = false,
|
||||
fear_height = 0,
|
||||
view_range = 16,
|
||||
follow = mobs_mc.follow.parrot,
|
||||
follow = {
|
||||
"mcl_farming:wheat_seeds",
|
||||
"mcl_farming:melon_seeds",
|
||||
"mcl_farming:pumpkin_seeds",
|
||||
"mcl_farming:beetroot_seeds",
|
||||
},
|
||||
on_rightclick = function(self, clicker)
|
||||
if self._doomed then return end
|
||||
local item = clicker:get_wielded_item()
|
||||
-- Kill parrot if fed with cookie
|
||||
if item:get_name() == mobs_mc.items.cookie then
|
||||
if item:get_name() == "mcl_farming:cookie" then
|
||||
minetest.sound_play("mobs_mc_animal_eat_generic", {object = self.object, max_hear_distance=16}, true)
|
||||
self.health = 0
|
||||
-- Doomed to die
|
||||
|
@ -82,17 +153,22 @@ mobs:register_mob("mobs_mc:parrot", {
|
|||
end
|
||||
return
|
||||
end
|
||||
|
||||
-- Feed to tame, but not breed
|
||||
if mobs:feed_tame(self, clicker, 1, false, true) then return end
|
||||
if mobs:protect(self, clicker) then return end
|
||||
if mobs:capture_mob(self, clicker, 0, 50, 80, false, nil) then return end
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, false, true) then return end
|
||||
perch(self,clicker)
|
||||
end,
|
||||
do_custom = function(self,dtime)
|
||||
check_perch(self,dtime)
|
||||
end,
|
||||
do_punch = function(self,puncher) --do_punch is the mcl_mobs_redo variant - it gets called by on_punch later....
|
||||
if self.object:get_attach() == puncher then
|
||||
return false --return false explicitly here. mcl_mobs checks for that
|
||||
end
|
||||
end,
|
||||
|
||||
})
|
||||
|
||||
-- Parrots spawn rarely in jungles. TODO: Also check for jungle *biome* <- I'll get to this eventually -j4i
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:parrot",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -107,8 +183,8 @@ minetest.LIGHT_MAX+1,
|
|||
7,
|
||||
30000,
|
||||
1,
|
||||
mobs_mc.spawn_height.water+7,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mobs_mc.water_level+7,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:parrot", S("Parrot"), "mobs_mc_spawn_icon_parrot.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:parrot", S("Parrot"), "mobs_mc_spawn_icon_parrot.png", 0)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
mobs:register_mob("mobs_mc:pig", {
|
||||
mcl_mobs:register_mob("mobs_mc:pig", {
|
||||
description = S("Pig"),
|
||||
type = "animal",
|
||||
spawn_class = "passive",
|
||||
|
@ -25,7 +25,7 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
run_velocity = 3,
|
||||
follow_velocity = 3.4,
|
||||
drops = {
|
||||
{name = mobs_mc.items.porkchop_raw,
|
||||
{name = "mcl_mobitems:porkchop",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 3,
|
||||
|
@ -50,7 +50,12 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
run_start = 0,
|
||||
run_end = 40,
|
||||
},
|
||||
follow = mobs_mc.follow.pig,
|
||||
follow = {
|
||||
"mcl_farming:potato_item",
|
||||
"mcl_farming:carrot_item",
|
||||
"mcl_farming:beetroot_item",
|
||||
"mcl_mobitems:carrot_on_a_stick"
|
||||
},
|
||||
view_range = 8,
|
||||
do_custom = function(self, dtime)
|
||||
|
||||
|
@ -69,7 +74,7 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
-- if driver present allow control of horse
|
||||
if self.driver then
|
||||
|
||||
mobs.drive(self, "walk", "stand", false, dtime)
|
||||
mcl_mobs.drive(self, "walk", "stand", false, dtime)
|
||||
|
||||
return false -- skip rest of mob functions
|
||||
end
|
||||
|
@ -82,7 +87,7 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
-- drop saddle when horse is killed while riding
|
||||
-- also detach from horse properly
|
||||
if self.driver then
|
||||
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
end
|
||||
end,
|
||||
|
||||
|
@ -93,10 +98,10 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
|
||||
local wielditem = clicker:get_wielded_item()
|
||||
-- Feed pig
|
||||
if wielditem:get_name() ~= mobs_mc.items.carrot_on_a_stick then
|
||||
if mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if wielditem:get_name() ~= "mcl_mobitems:carrot_on_a_stick" then
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
end
|
||||
if mobs:protect(self, clicker) then return end
|
||||
if mcl_mobs:protect(self, clicker) then return end
|
||||
|
||||
if self.child then
|
||||
return
|
||||
|
@ -104,7 +109,7 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
|
||||
-- Put saddle on pig
|
||||
local item = clicker:get_wielded_item()
|
||||
if item:get_name() == mobs_mc.items.saddle and self.saddle ~= "yes" then
|
||||
if item:get_name() == "mcl_mobitems:saddle" and self.saddle ~= "yes" then
|
||||
self.base_texture = {
|
||||
"blank.png", -- baby
|
||||
"mobs_mc_pig.png", -- base
|
||||
|
@ -116,11 +121,11 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
self.saddle = "yes"
|
||||
self.tamed = true
|
||||
self.drops = {
|
||||
{name = mobs_mc.items.porkchop_raw,
|
||||
{name = "mcl_mobitems:porkchop",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 3,},
|
||||
{name = mobs_mc.items.saddle,
|
||||
{name = "mcl_mobitems:saddle",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,},
|
||||
|
@ -139,13 +144,13 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
local name = clicker:get_player_name()
|
||||
if self.driver and clicker == self.driver then
|
||||
-- Detach if already attached
|
||||
mobs.detach(clicker, {x=1, y=0, z=0})
|
||||
mcl_mobs.detach(clicker, {x=1, y=0, z=0})
|
||||
return
|
||||
|
||||
elseif not self.driver and self.saddle == "yes" and wielditem:get_name() == mobs_mc.items.carrot_on_a_stick then
|
||||
elseif not self.driver and self.saddle == "yes" and wielditem:get_name() == "mcl_mobitems:carrot_on_a_stick" then
|
||||
-- Ride pig if it has a saddle and player uses a carrot on a stick
|
||||
|
||||
mobs.attach(self, clicker)
|
||||
mcl_mobs.attach(self, clicker)
|
||||
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
|
||||
|
@ -157,7 +162,7 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
if def.sounds and def.sounds.breaks then
|
||||
minetest.sound_play(def.sounds.breaks, {pos = clicker:get_pos(), max_hear_distance = 8, gain = 0.5}, true)
|
||||
end
|
||||
wielditem = {name = mobs_mc.items.fishing_rod, count = 1}
|
||||
wielditem = {name = "mcl_fishing:fishing_rod", count = 1}
|
||||
else
|
||||
wielditem:add_wear(2521)
|
||||
end
|
||||
|
@ -167,13 +172,13 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
|
||||
-- Capture pig
|
||||
elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then
|
||||
mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
|
||||
end
|
||||
end,
|
||||
|
||||
on_breed = function(parent1, parent2)
|
||||
local pos = parent1.object:get_pos()
|
||||
local child = mobs:spawn_child(pos, parent1.name)
|
||||
local child = mcl_mobs:spawn_child(pos, parent1.name)
|
||||
if child then
|
||||
local ent_c = child:get_luaentity()
|
||||
ent_c.tamed = true
|
||||
|
@ -183,7 +188,7 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
end,
|
||||
})
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:pig",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -230,8 +235,8 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
15000,
|
||||
8,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:pig", S("Pig"), "mobs_mc_spawn_icon_pig.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:pig", S("Pig"), "mobs_mc_spawn_icon_pig.png", 0)
|
||||
|
|
|
@ -7,7 +7,7 @@ local S = minetest.get_translator("mobs_mc")
|
|||
--###################
|
||||
|
||||
|
||||
mobs:register_mob("mobs_mc:polar_bear", {
|
||||
mcl_mobs:register_mob("mobs_mc:polar_bear", {
|
||||
description = S("Polar Bear"),
|
||||
type = "animal",
|
||||
spawn_class = "passive",
|
||||
|
@ -34,13 +34,13 @@ mobs:register_mob("mobs_mc:polar_bear", {
|
|||
attack_type = "dogfight",
|
||||
drops = {
|
||||
-- 3/4 chance to drop raw fish (poor approximation)
|
||||
{name = mobs_mc.items.fish_raw,
|
||||
{name = "mcl_fishing:fish_raw",
|
||||
chance = 2,
|
||||
min = 0,
|
||||
max = 2,
|
||||
looting = "common",},
|
||||
-- 1/4 to drop raw salmon
|
||||
{name = mobs_mc.items.salmon_raw,
|
||||
{name = "mcl_fishing:salmon_raw",
|
||||
chance = 4,
|
||||
min = 0,
|
||||
max = 2,
|
||||
|
@ -68,7 +68,7 @@ mobs:register_mob("mobs_mc:polar_bear", {
|
|||
})
|
||||
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:polar_bear",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -83,8 +83,8 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
7000,
|
||||
3,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn egg
|
||||
mobs:register_egg("mobs_mc:polar_bear", S("Polar Bear"), "mobs_mc_spawn_icon_polarbear.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:polar_bear", S("Polar Bear"), "mobs_mc_spawn_icon_polarbear.png", 0)
|
||||
|
|
|
@ -42,9 +42,9 @@ local rabbit = {
|
|||
runaway = true,
|
||||
jump = true,
|
||||
drops = {
|
||||
{name = mobs_mc.items.rabbit_raw, chance = 1, min = 0, max = 1, looting = "common",},
|
||||
{name = mobs_mc.items.rabbit_hide, chance = 1, min = 0, max = 1, looting = "common",},
|
||||
{name = mobs_mc.items.rabbit_foot, chance = 10, min = 0, max = 1, looting = "rare", looting_factor = 0.03,},
|
||||
{name = "mcl_mobitems:rabbit", chance = 1, min = 0, max = 1, looting = "common",},
|
||||
{name = "mcl_mobitems:rabbit_hide", chance = 1, min = 0, max = 1, looting = "common",},
|
||||
{name = "mcl_mobitems:rabbit_foot", chance = 10, min = 0, max = 1, looting = "rare", looting_factor = 0.03,},
|
||||
},
|
||||
fear_height = 4,
|
||||
animation = {
|
||||
|
@ -54,16 +54,29 @@ local rabbit = {
|
|||
run_start = 0, run_end = 20,
|
||||
},
|
||||
-- Follow (yellow) dangelions, carrots and golden carrots
|
||||
follow = mobs_mc.follow.rabbit,
|
||||
follow = {
|
||||
"mcl_flowers:dandelion",
|
||||
"mcl_farming:carrot_item",
|
||||
"mcl_farming:carrot_item_gold",
|
||||
},
|
||||
view_range = 8,
|
||||
-- Eat carrots and reduce their growth stage by 1
|
||||
replace_rate = 10,
|
||||
replace_what = mobs_mc.replace.rabbit,
|
||||
replace_what = {
|
||||
{"mcl_farming:carrot", "mcl_farming:carrot_7", 0},
|
||||
{"mcl_farming:carrot_7", "mcl_farming:carrot_6", 0},
|
||||
{"mcl_farming:carrot_6", "mcl_farming:carrot_5", 0},
|
||||
{"mcl_farming:carrot_5", "mcl_farming:carrot_4", 0},
|
||||
{"mcl_farming:carrot_4", "mcl_farming:carrot_3", 0},
|
||||
{"mcl_farming:carrot_3", "mcl_farming:carrot_2", 0},
|
||||
{"mcl_farming:carrot_2", "mcl_farming:carrot_1", 0},
|
||||
{"mcl_farming:carrot_1", "air", 0},
|
||||
},
|
||||
on_rightclick = function(self, clicker)
|
||||
-- Feed, tame protect or capture
|
||||
if mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mobs:protect(self, clicker) then return end
|
||||
if mobs:capture_mob(self, clicker, 0, 50, 80, false, nil) then return end
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mcl_mobs:protect(self, clicker) then return end
|
||||
if mcl_mobs:capture_mob(self, clicker, 0, 50, 80, false, nil) then return end
|
||||
end,
|
||||
do_custom = function(self)
|
||||
-- Easter egg: Change texture if rabbit is named “Toast”
|
||||
|
@ -80,7 +93,7 @@ local rabbit = {
|
|||
end,
|
||||
}
|
||||
|
||||
mobs:register_mob("mobs_mc:rabbit", rabbit)
|
||||
mcl_mobs:register_mob("mobs_mc:rabbit", rabbit)
|
||||
|
||||
-- The killer bunny (Only with spawn egg)
|
||||
local killer_bunny = table.copy(rabbit)
|
||||
|
@ -106,25 +119,24 @@ killer_bunny.do_custom = function(self)
|
|||
end
|
||||
end
|
||||
|
||||
mobs:register_mob("mobs_mc:killer_bunny", killer_bunny)
|
||||
mcl_mobs:register_mob("mobs_mc:killer_bunny", killer_bunny)
|
||||
|
||||
-- Mob spawning rules.
|
||||
-- Different skins depending on spawn location <- we'll get to this when the spawning algorithm is fleshed out
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:rabbit",
|
||||
"overworld",
|
||||
"ground",
|
||||
{
|
||||
"Desert",
|
||||
"FlowerForest",
|
||||
"Swampland",
|
||||
"Taiga",
|
||||
"ExtremeHills",
|
||||
"BirchForest",
|
||||
"MegaSpruceTaiga",
|
||||
"MegaTaiga",
|
||||
"ExtremeHills+",
|
||||
"Forest",
|
||||
"Plains",
|
||||
"ColdTaiga",
|
||||
"SunflowerPlains",
|
||||
|
@ -138,8 +150,8 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
15000,
|
||||
8,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
--[[
|
||||
local spawn = {
|
||||
|
@ -149,21 +161,21 @@ local spawn = {
|
|||
active_object_count = 10,
|
||||
min_light = 0,
|
||||
max_light = minetest.LIGHT_MAX+1,
|
||||
min_height = mobs_mc.spawn_height.overworld_min,
|
||||
max_height = mobs_mc.spawn_height.overworld_max,
|
||||
min_height = mcl_vars.mg_overworld_min,
|
||||
max_height = mcl_vars.mg_overworld_max,
|
||||
}
|
||||
|
||||
local spawn_desert = table.copy(spawn)
|
||||
spawn_desert.nodes = mobs_mc.spawn.desert
|
||||
spawn_desert.nodes = { "mcl_core:sand", "mcl_core:sandstone" }
|
||||
spawn_desert.on_spawn = function(self, pos)
|
||||
local texture = "mobs_mc_rabbit_gold.png"
|
||||
self.base_texture = { "mobs_mc_rabbit_gold.png" }
|
||||
self.object:set_properties({textures = self.base_texture})
|
||||
end
|
||||
mobs:spawn(spawn_desert)
|
||||
mcl_mobs:spawn(spawn_desert)
|
||||
|
||||
local spawn_snow = table.copy(spawn)
|
||||
spawn_snow.nodes = mobs_mc.spawn.snow
|
||||
spawn_snow.nodes = { "mcl_core:snow", "mcl_core:snowblock", "mcl_core:dirt_with_grass_snow" }
|
||||
spawn_snow.on_spawn = function(self, pos)
|
||||
local texture
|
||||
local r = math.random(1, 100)
|
||||
|
@ -177,10 +189,10 @@ spawn_snow.on_spawn = function(self, pos)
|
|||
self.base_texture = { texture }
|
||||
self.object:set_properties({textures = self.base_texture})
|
||||
end
|
||||
mobs:spawn(spawn_snow)
|
||||
mcl_mobs:spawn(spawn_snow)
|
||||
|
||||
local spawn_grass = table.copy(spawn)
|
||||
spawn_grass.nodes = mobs_mc.spawn.grassland
|
||||
spawn_grass.nodes = { "mcl_core:dirt_with_grass" }
|
||||
spawn_grass.on_spawn = function(self, pos)
|
||||
local texture
|
||||
local r = math.random(1, 100)
|
||||
|
@ -197,11 +209,11 @@ spawn_grass.on_spawn = function(self, pos)
|
|||
self.base_texture = { texture }
|
||||
self.object:set_properties({textures = self.base_texture})
|
||||
end
|
||||
mobs:spawn(spawn_grass)
|
||||
mcl_mobs:spawn(spawn_grass)
|
||||
]]--
|
||||
|
||||
-- Spawn egg
|
||||
mobs:register_egg("mobs_mc:rabbit", S("Rabbit"), "mobs_mc_spawn_icon_rabbit.png", 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
|
||||
mobs:register_egg("mobs_mc:killer_bunny", S("Killer Bunny"), "mobs_mc_spawn_icon_rabbit.png^[colorize:#FF0000:192", 0) -- TODO: Update inventory image
|
||||
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
|
||||
|
|
|
@ -8,21 +8,22 @@ local S = minetest.get_translator("mobs_mc")
|
|||
|
||||
local colors = {
|
||||
-- group = { wool, textures }
|
||||
unicolor_white = { mobs_mc.items.wool_white, "#FFFFFF00" },
|
||||
unicolor_dark_orange = { mobs_mc.items.wool_brown, "#502A00D0" },
|
||||
unicolor_grey = { mobs_mc.items.wool_light_grey, "#5B5B5BD0" },
|
||||
unicolor_darkgrey = { mobs_mc.items.wool_grey, "#303030D0" },
|
||||
unicolor_blue = { mobs_mc.items.wool_blue, "#0000CCD0" },
|
||||
unicolor_dark_green = { mobs_mc.items.wool_green, "#005000D0" },
|
||||
unicolor_green = { mobs_mc.items.wool_lime, "#50CC00D0" },
|
||||
unicolor_violet = { mobs_mc.items.wool_purple , "#5000CCD0" },
|
||||
unicolor_light_red = { mobs_mc.items.wool_pink, "#FF5050D0" },
|
||||
unicolor_yellow = { mobs_mc.items.wool_yellow, "#CCCC00D0" },
|
||||
unicolor_orange = { mobs_mc.items.wool_orange, "#CC5000D0" },
|
||||
unicolor_red = { mobs_mc.items.wool_red, "#CC0000D0" },
|
||||
unicolor_cyan = { mobs_mc.items.wool_cyan, "#00CCCCD0" },
|
||||
unicolor_red_violet = { mobs_mc.items.wool_magenta, "#CC0050D0" },
|
||||
unicolor_black = { mobs_mc.items.wool_black, "#000000D0" },
|
||||
unicolor_white = { "mcl_wool:white", "#FFFFFF00" },
|
||||
unicolor_dark_orange = { "mcl_wool:brown", "#502A00D0" },
|
||||
unicolor_grey = { "mcl_wool:silver", "#5B5B5BD0" },
|
||||
unicolor_darkgrey = { "mcl_wool:grey", "#303030D0" },
|
||||
unicolor_blue = { "mcl_wool:blue", "#0000CCD0" },
|
||||
unicolor_dark_green = { "mcl_wool:green", "#005000D0" },
|
||||
unicolor_green = { "mcl_wool:lime", "#50CC00D0" },
|
||||
unicolor_violet = { "mcl_wool:purple" , "#5000CCD0" },
|
||||
unicolor_light_red = { "mcl_wool:pink", "#FF5050D0" },
|
||||
unicolor_yellow = { "mcl_wool:yellow", "#CCCC00D0" },
|
||||
unicolor_orange = { "mcl_wool:orange", "#CC5000D0" },
|
||||
unicolor_red = { "mcl_wool:red", "#CC0000D0" },
|
||||
unicolor_cyan = { "mcl_wool:cyan", "#00CCCCD0" },
|
||||
unicolor_red_violet = { "mcl_wool:magenta", "#CC0050D0" },
|
||||
unicolor_black = { "mcl_wool:black", "#000000D0" },
|
||||
unicolor_light_blue = { "mcl_wool:light_blue", "#5050FFD0" },
|
||||
}
|
||||
|
||||
local rainbow_colors = {
|
||||
|
@ -38,10 +39,6 @@ local rainbow_colors = {
|
|||
"unicolor_red_violet"
|
||||
}
|
||||
|
||||
if minetest.get_modpath("mcl_wool") ~= nil then
|
||||
colors["unicolor_light_blue"] = { mobs_mc.items.wool_light_blue, "#5050FFD0" }
|
||||
end
|
||||
|
||||
local sheep_texture = function(color_group)
|
||||
if not color_group then
|
||||
color_group = "unicolor_white"
|
||||
|
@ -55,7 +52,7 @@ end
|
|||
local gotten_texture = { "blank.png", "mobs_mc_sheep.png" }
|
||||
|
||||
--mcsheep
|
||||
mobs:register_mob("mobs_mc:sheep", {
|
||||
mcl_mobs:register_mob("mobs_mc:sheep", {
|
||||
description = S("Sheep"),
|
||||
type = "animal",
|
||||
spawn_class = "passive",
|
||||
|
@ -74,7 +71,7 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
makes_footstep_sound = true,
|
||||
walk_velocity = 1,
|
||||
drops = {
|
||||
{name = mobs_mc.items.mutton_raw,
|
||||
{name = "mcl_mobitems:mutton",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 2,
|
||||
|
@ -99,12 +96,15 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
walk_start = 0, walk_end = 40,
|
||||
run_start = 0, run_end = 40,
|
||||
},
|
||||
follow = mobs_mc.follow.sheep,
|
||||
follow = { "mcl_farming:wheat_item" },
|
||||
view_range = 12,
|
||||
|
||||
-- Eat grass
|
||||
replace_rate = 20,
|
||||
replace_what = mobs_mc.replace.sheep,
|
||||
replace_what = {
|
||||
{ "mcl_core:dirt_with_grass", "mcl_core:dirt", -1 },
|
||||
{ "mcl_flowers:tallgrass", "air", 0 },
|
||||
},
|
||||
-- Properly regrow wool after eating grass
|
||||
on_replace = function(self, pos, oldnode, newnode)
|
||||
if not self.color or not colors[self.color] then
|
||||
|
@ -114,7 +114,7 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
self.base_texture = sheep_texture(self.color)
|
||||
self.object:set_properties({ textures = self.base_texture })
|
||||
self.drops = {
|
||||
{name = mobs_mc.items.mutton_raw,
|
||||
{name = "mcl_mobitems:mutton",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 2,},
|
||||
|
@ -152,7 +152,7 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
self.base_texture = sheep_texture(self.color)
|
||||
self.object:set_properties({ textures = self.base_texture })
|
||||
self.drops = {
|
||||
{name = mobs_mc.items.mutton_raw,
|
||||
{name = "mcl_mobitems:mutton",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 2,},
|
||||
|
@ -195,10 +195,10 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
on_rightclick = function(self, clicker)
|
||||
local item = clicker:get_wielded_item()
|
||||
|
||||
if mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mobs:protect(self, clicker) then return end
|
||||
if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end
|
||||
if mcl_mobs:protect(self, clicker) then return end
|
||||
|
||||
if item:get_name() == mobs_mc.items.shears and not self.gotten and not self.child then
|
||||
if item:get_name() == "mcl_tools:shears" and not self.gotten and not self.child then
|
||||
self.gotten = true
|
||||
local pos = self.object:get_pos()
|
||||
minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true)
|
||||
|
@ -212,11 +212,11 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
textures = self.base_texture,
|
||||
})
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:add_wear(mobs_mc.misc.shears_wear)
|
||||
item:add_wear(mobs_mc.shears_wear)
|
||||
clicker:get_inventory():set_stack("main", clicker:get_wield_index(), item)
|
||||
end
|
||||
self.drops = {
|
||||
{name = mobs_mc.items.mutton_raw,
|
||||
{name = "mcl_mobitems:mutton",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 2,},
|
||||
|
@ -238,7 +238,7 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
})
|
||||
self.color = group
|
||||
self.drops = {
|
||||
{name = mobs_mc.items.mutton_raw,
|
||||
{name = "mcl_mobitems:mutton",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 2,},
|
||||
|
@ -252,12 +252,12 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
end
|
||||
return
|
||||
end
|
||||
if mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end
|
||||
if mcl_mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end
|
||||
end,
|
||||
on_breed = function(parent1, parent2)
|
||||
-- Breed sheep and choose a fur color for the child.
|
||||
local pos = parent1.object:get_pos()
|
||||
local child = mobs:spawn_child(pos, parent1.name)
|
||||
local child = mcl_mobs:spawn_child(pos, parent1.name)
|
||||
if child then
|
||||
local ent_c = child:get_luaentity()
|
||||
local color1 = parent1.color
|
||||
|
@ -304,7 +304,7 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
end
|
||||
end,
|
||||
})
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:sheep",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -351,8 +351,8 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
15000,
|
||||
3,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:sheep", S("Sheep"), "mobs_mc_spawn_icon_sheep.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:sheep", S("Sheep"), "mobs_mc_spawn_icon_sheep.png", 0)
|
||||
|
|
|
@ -11,7 +11,7 @@ local S = minetest.get_translator("mobs_mc")
|
|||
|
||||
-- animation 45-80 is transition between passive and attack stance
|
||||
|
||||
mobs:register_mob("mobs_mc:shulker", {
|
||||
mcl_mobs:register_mob("mobs_mc:shulker", {
|
||||
description = S("Shulker"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -35,7 +35,7 @@ mobs:register_mob("mobs_mc:shulker", {
|
|||
walk_chance = 0,
|
||||
jump = false,
|
||||
drops = {
|
||||
{name = mobs_mc.items.shulker_shell,
|
||||
{name = "mcl_mobitems:shulker_shell",
|
||||
chance = 2,
|
||||
min = 1,
|
||||
max = 1,
|
||||
|
@ -55,7 +55,7 @@ mobs:register_mob("mobs_mc:shulker", {
|
|||
})
|
||||
|
||||
-- bullet arrow (weapon)
|
||||
mobs:register_arrow("mobs_mc:shulkerbullet", {
|
||||
mcl_mobs:register_arrow("mobs_mc:shulkerbullet", {
|
||||
visual = "sprite",
|
||||
visual_size = {x = 0.25, y = 0.25},
|
||||
textures = {"mobs_mc_shulkerbullet.png"},
|
||||
|
@ -80,9 +80,9 @@ mobs:register_arrow("mobs_mc:shulkerbullet", {
|
|||
})
|
||||
|
||||
|
||||
mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0)
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:shulker",
|
||||
"end",
|
||||
"ground",
|
||||
|
@ -94,5 +94,5 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
5000,
|
||||
2,
|
||||
mobs_mc.spawn_height.end_min,
|
||||
mobs_mc.spawn_height.end_max)
|
||||
mcl_vars.mg_end_min,
|
||||
mcl_vars.mg_end_max)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
mobs:register_mob("mobs_mc:silverfish", {
|
||||
mcl_mobs:register_mob("mobs_mc:silverfish", {
|
||||
description = S("Silverfish"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -35,7 +35,14 @@ mobs:register_mob("mobs_mc:silverfish", {
|
|||
run_velocity = 2,
|
||||
jump = true,
|
||||
fear_height = 4,
|
||||
replace_what = mobs_mc.replace.silverfish,
|
||||
replace_what = {
|
||||
{"mcl_core:stone", "mcl_monster_eggs:monster_egg_stone", -1},
|
||||
{"mcl_core:cobble", "mcl_monster_eggs:monster_egg_cobble", -1},
|
||||
{"mcl_core:stonebrick", "mcl_monster_eggs:monster_egg_stonebrick", -1},
|
||||
{"mcl_core:stonebrickmossy", "mcl_monster_eggs:monster_egg_stonebrickmossy", -1},
|
||||
{"mcl_core:stonebrickcracked", "mcl_monster_eggs:monster_egg_stonebrickcracked", -1},
|
||||
{"mcl_core:stonebrickcarved", "mcl_monster_eggs:monster_egg_stonebrickcarved", -1},
|
||||
},
|
||||
replace_rate = 2,
|
||||
animation = {
|
||||
speed_normal = 25, speed_run = 50,
|
||||
|
@ -49,7 +56,7 @@ mobs:register_mob("mobs_mc:silverfish", {
|
|||
reach = 1,
|
||||
})
|
||||
|
||||
mobs:register_egg("mobs_mc:silverfish", S("Silverfish"), "mobs_mc_spawn_icon_silverfish.png", 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
|
||||
|
|
|
@ -45,17 +45,17 @@ local skeleton = {
|
|||
damage = 2,
|
||||
reach = 2,
|
||||
drops = {
|
||||
{name = mobs_mc.items.arrow,
|
||||
{name = "mcl_bows:arrow",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
looting = "common",},
|
||||
{name = mobs_mc.items.bow,
|
||||
{name = "mcl_bows:bow",
|
||||
chance = 100 / 8.5,
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "rare",},
|
||||
{name = mobs_mc.items.bone,
|
||||
{name = "mcl_mobitems:bone",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
|
@ -63,7 +63,7 @@ local skeleton = {
|
|||
|
||||
-- Head
|
||||
-- TODO: Only drop if killed by charged creeper
|
||||
{name = mobs_mc.items.head_skeleton,
|
||||
{name = "mcl_heads:skeleton",
|
||||
chance = 200, -- 0.5% chance
|
||||
min = 1,
|
||||
max = 1,},
|
||||
|
@ -102,7 +102,7 @@ local skeleton = {
|
|||
harmed_by_heal = true,
|
||||
}
|
||||
|
||||
mobs:register_mob("mobs_mc:skeleton", skeleton)
|
||||
mcl_mobs:register_mob("mobs_mc:skeleton", skeleton)
|
||||
|
||||
|
||||
--###################
|
||||
|
@ -139,10 +139,10 @@ table.insert(stray.drops, {
|
|||
end,
|
||||
})
|
||||
|
||||
mobs:register_mob("mobs_mc:stray", stray)
|
||||
mcl_mobs:register_mob("mobs_mc:stray", stray)
|
||||
|
||||
-- Overworld spawn
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:skeleton",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -292,12 +292,12 @@ mobs:spawn_specific(
|
|||
20,
|
||||
17000,
|
||||
2,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
|
||||
-- Nether spawn
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:skeleton",
|
||||
"nether",
|
||||
"ground",
|
||||
|
@ -309,12 +309,12 @@ mobs:spawn_specific(
|
|||
30,
|
||||
10000,
|
||||
3,
|
||||
mobs_mc.spawn_height.nether_min,
|
||||
mobs_mc.spawn_height.nether_max)
|
||||
mcl_vars.mg_nether_min,
|
||||
mcl_vars.mg_nether_max)
|
||||
|
||||
-- Stray spawn
|
||||
-- TODO: Spawn directly under the sky
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:stray",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -329,10 +329,10 @@ mobs:spawn_specific(
|
|||
20,
|
||||
19000,
|
||||
2,
|
||||
mobs_mc.spawn_height.water,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mobs_mc.water_level,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:skeleton", S("Skeleton"), "mobs_mc_spawn_icon_skeleton.png", 0)
|
||||
mobs:register_egg("mobs_mc:stray", S("Stray"), "mobs_mc_spawn_icon_stray.png", 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)
|
||||
|
|
|
@ -9,7 +9,7 @@ local S = minetest.get_translator("mobs_mc")
|
|||
--################### WITHER SKELETON
|
||||
--###################
|
||||
|
||||
mobs:register_mob("mobs_mc:witherskeleton", {
|
||||
mcl_mobs:register_mob("mobs_mc:witherskeleton", {
|
||||
description = S("Wither Skeleton"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -44,19 +44,19 @@ mobs:register_mob("mobs_mc:witherskeleton", {
|
|||
damage = 7,
|
||||
reach = 2,
|
||||
drops = {
|
||||
{name = mobs_mc.items.coal,
|
||||
{name = "mcl_core:coal_lump",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 1,
|
||||
looting = "common",},
|
||||
{name = mobs_mc.items.bone,
|
||||
{name = "mcl_mobitems:bone",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
looting = "common",},
|
||||
|
||||
-- Head
|
||||
{name = mobs_mc.items.head_wither_skeleton,
|
||||
{name = "mcl_heads:wither_skeleton",
|
||||
chance = 40, -- 2.5% chance
|
||||
min = 1,
|
||||
max = 1,
|
||||
|
@ -96,7 +96,7 @@ mobs:register_mob("mobs_mc:witherskeleton", {
|
|||
})
|
||||
|
||||
--spawn
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:witherskeleton",
|
||||
"nether",
|
||||
"ground",
|
||||
|
@ -108,8 +108,8 @@ mobs:spawn_specific(
|
|||
30,
|
||||
5000,
|
||||
5,
|
||||
mobs_mc.spawn_height.nether_min,
|
||||
mobs_mc.spawn_height.nether_max)
|
||||
mcl_vars.mg_nether_min,
|
||||
mcl_vars.mg_nether_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "mobs_mc_spawn_icon_witherskeleton.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "mobs_mc_spawn_icon_witherskeleton.png", 0)
|
||||
|
|
|
@ -109,7 +109,7 @@ local slime_big = {
|
|||
on_die = spawn_children_on_die("mobs_mc:slime_small", 4, 1.0, 1.5),
|
||||
use_texture_alpha = true,
|
||||
}
|
||||
mobs:register_mob("mobs_mc:slime_big", slime_big)
|
||||
mcl_mobs:register_mob("mobs_mc:slime_big", slime_big)
|
||||
|
||||
local slime_small = table.copy(slime_big)
|
||||
slime_small.sounds.base_pitch = 1.15
|
||||
|
@ -126,7 +126,7 @@ slime_small.run_velocity = 1.3
|
|||
slime_small.jump_height = 4.3
|
||||
slime_small.spawn_small_alternative = "mobs_mc:slime_tiny"
|
||||
slime_small.on_die = spawn_children_on_die("mobs_mc:slime_tiny", 4, 0.6, 1.0)
|
||||
mobs:register_mob("mobs_mc:slime_small", slime_small)
|
||||
mcl_mobs:register_mob("mobs_mc:slime_small", slime_small)
|
||||
|
||||
local slime_tiny = table.copy(slime_big)
|
||||
slime_tiny.sounds.base_pitch = 1.3
|
||||
|
@ -140,7 +140,7 @@ slime_tiny.damage = 0
|
|||
slime_tiny.reach = 2.5
|
||||
slime_tiny.drops = {
|
||||
-- slimeball
|
||||
{name = mobs_mc.items.slimeball,
|
||||
{name = "mcl_mobitems:slimeball",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,},
|
||||
|
@ -151,12 +151,12 @@ slime_tiny.jump_height = 3
|
|||
slime_tiny.spawn_small_alternative = nil
|
||||
slime_tiny.on_die = nil
|
||||
|
||||
mobs:register_mob("mobs_mc:slime_tiny", slime_tiny)
|
||||
mcl_mobs:register_mob("mobs_mc:slime_tiny", slime_tiny)
|
||||
|
||||
local smin = mobs_mc.spawn_height.overworld_min
|
||||
local smax = mobs_mc.spawn_height.water - 23
|
||||
local smin = mcl_vars.mg_overworld_min
|
||||
local smax = mobs_mc.water_level - 23
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:slime_tiny",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -200,7 +200,7 @@ minetest.LIGHT_MAX+1,
|
|||
smin,
|
||||
smax)
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:slime_small",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -244,7 +244,7 @@ minetest.LIGHT_MAX+1,
|
|||
smin,
|
||||
smax)
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:slime_big",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -315,7 +315,7 @@ local magma_cube_big = {
|
|||
reach = 3,
|
||||
armor = 53,
|
||||
drops = {
|
||||
{name = mobs_mc.items.magma_cream,
|
||||
{name = "mcl_mobitems:magma_cream",
|
||||
chance = 4,
|
||||
min = 1,
|
||||
max = 1,},
|
||||
|
@ -348,7 +348,7 @@ local magma_cube_big = {
|
|||
on_die = spawn_children_on_die("mobs_mc:magma_cube_small", 3, 0.8, 1.5),
|
||||
fire_resistant = true,
|
||||
}
|
||||
mobs:register_mob("mobs_mc:magma_cube_big", magma_cube_big)
|
||||
mcl_mobs:register_mob("mobs_mc:magma_cube_big", magma_cube_big)
|
||||
|
||||
local magma_cube_small = table.copy(magma_cube_big)
|
||||
magma_cube_small.sounds.jump = "mobs_mc_magma_cube_small"
|
||||
|
@ -369,7 +369,7 @@ magma_cube_small.reach = 2.75
|
|||
magma_cube_small.armor = 66
|
||||
magma_cube_small.spawn_small_alternative = "mobs_mc:magma_cube_tiny"
|
||||
magma_cube_small.on_die = spawn_children_on_die("mobs_mc:magma_cube_tiny", 4, 0.6, 1.0)
|
||||
mobs:register_mob("mobs_mc:magma_cube_small", magma_cube_small)
|
||||
mcl_mobs:register_mob("mobs_mc:magma_cube_small", magma_cube_small)
|
||||
|
||||
local magma_cube_tiny = table.copy(magma_cube_big)
|
||||
magma_cube_tiny.sounds.jump = "mobs_mc_magma_cube_small"
|
||||
|
@ -391,13 +391,13 @@ magma_cube_tiny.drops = {}
|
|||
magma_cube_tiny.spawn_small_alternative = nil
|
||||
magma_cube_tiny.on_die = nil
|
||||
|
||||
mobs:register_mob("mobs_mc:magma_cube_tiny", magma_cube_tiny)
|
||||
mcl_mobs:register_mob("mobs_mc:magma_cube_tiny", magma_cube_tiny)
|
||||
|
||||
|
||||
local mmin = mobs_mc.spawn_height.nether_min
|
||||
local mmax = mobs_mc.spawn_height.nether_max
|
||||
local mmin = mcl_vars.mg_nether_min
|
||||
local mmax = mcl_vars.mg_nether_max
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:magma_cube_tiny",
|
||||
"nether",
|
||||
"ground",
|
||||
|
@ -413,7 +413,7 @@ mmin,
|
|||
mmax)
|
||||
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:magma_cube_small",
|
||||
"nether",
|
||||
"ground",
|
||||
|
@ -428,7 +428,7 @@ minetest.LIGHT_MAX+1,
|
|||
mmin,
|
||||
mmax)
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:magma_cube_big",
|
||||
"nether",
|
||||
"ground",
|
||||
|
@ -443,11 +443,11 @@ minetest.LIGHT_MAX+1,
|
|||
mmin,
|
||||
mmax)
|
||||
|
||||
--mobs:spawn_specific("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11000, 4, mmin, mmax)
|
||||
--mobs:spawn_specific("mobs_mc:magma_cube_small", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11100, 4, mmin, mmax)
|
||||
--mobs:spawn_specific("mobs_mc:magma_cube_big", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11200, 4, mmin, mmax)
|
||||
--mcl_mobs:spawn_specific("mobs_mc:magma_cube_tiny", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11000, 4, mmin, mmax)
|
||||
--mcl_mobs:spawn_specific("mobs_mc:magma_cube_small", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11100, 4, mmin, mmax)
|
||||
--mcl_mobs:spawn_specific("mobs_mc:magma_cube_big", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11200, 4, mmin, mmax)
|
||||
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "mobs_mc_spawn_icon_magmacube.png")
|
||||
mobs:register_egg("mobs_mc:slime_big", S("Slime"), "mobs_mc_spawn_icon_slime.png")
|
||||
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")
|
||||
|
|
|
@ -20,7 +20,7 @@ local gotten_texture = {
|
|||
"blank.png",
|
||||
}
|
||||
|
||||
mobs:register_mob("mobs_mc:snowman", {
|
||||
mcl_mobs:register_mob("mobs_mc:snowman", {
|
||||
description = S("Snow Golem"),
|
||||
type = "npc",
|
||||
spawn_class = "passive",
|
||||
|
@ -52,7 +52,7 @@ mobs:register_mob("mobs_mc:snowman", {
|
|||
"farming_pumpkin_top.png", --left
|
||||
},
|
||||
gotten_texture = gotten_texture,
|
||||
drops = {{ name = mobs_mc.items.snowball, chance = 1, min = 0, max = 15 }},
|
||||
drops = {{ name = "mcl_throwing:snowball", chance = 1, min = 0, max = 15 }},
|
||||
visual_size = {x=3, y=3},
|
||||
walk_velocity = 0.6,
|
||||
run_velocity = 2,
|
||||
|
@ -106,7 +106,7 @@ mobs:register_mob("mobs_mc:snowman", {
|
|||
local belowdef = minetest.registered_nodes[minetest.get_node(below).name]
|
||||
if belowdef and belowdef.walkable and (belowdef.node_box == nil or belowdef.node_box.type == "regular") then
|
||||
-- Place top snow
|
||||
minetest.set_node(pos, {name = mobs_mc.items.top_snow})
|
||||
minetest.set_node(pos, {name = "mcl_core:snow"})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -114,7 +114,7 @@ mobs:register_mob("mobs_mc:snowman", {
|
|||
-- Remove pumpkin if using shears
|
||||
on_rightclick = function(self, clicker)
|
||||
local item = clicker:get_wielded_item()
|
||||
if self.gotten ~= true and item:get_name() == mobs_mc.items.shears then
|
||||
if self.gotten ~= true and item:get_name() == "mcl_tools:shears" then
|
||||
-- Remove pumpkin
|
||||
self.gotten = true
|
||||
self.object:set_properties({
|
||||
|
@ -130,7 +130,7 @@ mobs:register_mob("mobs_mc:snowman", {
|
|||
|
||||
-- Wear out
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:add_wear(mobs_mc.misc.shears_wear)
|
||||
item:add_wear(mobs_mc.shears_wear)
|
||||
clicker:get_inventory():set_stack("main", clicker:get_wield_index(), item)
|
||||
end
|
||||
end
|
||||
|
@ -160,7 +160,7 @@ end
|
|||
-- 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 a snow golen when pos is next to a row of two snow blocks.
|
||||
mobs_mc.tools.check_snow_golem_summon = function(pos)
|
||||
function mobs_mc.check_snow_golem_summon(pos)
|
||||
local checks = {
|
||||
-- These are the possible placement patterns
|
||||
-- { snow block pos. 1, snow block pos. 2, snow golem spawn position }
|
||||
|
@ -178,7 +178,7 @@ mobs_mc.tools.check_snow_golem_summon = function(pos)
|
|||
local place = checks[c][3]
|
||||
local b1n = minetest.get_node(b1)
|
||||
local b2n = minetest.get_node(b2)
|
||||
if b1n.name == mobs_mc.items.snow_block and b2n.name == mobs_mc.items.snow_block then
|
||||
if b1n.name == "mcl_core:snowblock" and b2n.name == "mcl_core:snowblock" then
|
||||
-- Remove the pumpkin and both snow blocks and summon the snow golem
|
||||
minetest.remove_node(pos)
|
||||
minetest.remove_node(b1)
|
||||
|
@ -196,4 +196,4 @@ mobs_mc.tools.check_snow_golem_summon = function(pos)
|
|||
end
|
||||
|
||||
-- Spawn egg
|
||||
mobs:register_egg("mobs_mc:snowman", S("Snow Golem"), "mobs_mc_spawn_icon_snowman.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:snowman", S("Snow Golem"), "mobs_mc_spawn_icon_snowman.png", 0)
|
||||
|
|
|
@ -50,8 +50,8 @@ local spider = {
|
|||
view_range = 16,
|
||||
floats = 1,
|
||||
drops = {
|
||||
{name = mobs_mc.items.string, chance = 1, min = 0, max = 2, looting = "common"},
|
||||
{name = mobs_mc.items.spider_eye, chance = 3, min = 1, max = 1, looting = "common", looting_chance_function = function(lvl)
|
||||
{name = "mcl_mobitems:string", chance = 1, min = 0, max = 2, looting = "common"},
|
||||
{name = "mcl_mobitems:spider_eye", chance = 3, min = 1, max = 1, looting = "common", looting_chance_function = function(lvl)
|
||||
return 1 - 2 / (lvl + 3)
|
||||
end},
|
||||
},
|
||||
|
@ -69,7 +69,7 @@ local spider = {
|
|||
run_end = 20,
|
||||
},
|
||||
}
|
||||
mobs:register_mob("mobs_mc:spider", spider)
|
||||
mcl_mobs:register_mob("mobs_mc:spider", spider)
|
||||
|
||||
-- Cave spider
|
||||
local cave_spider = table.copy(spider)
|
||||
|
@ -86,10 +86,10 @@ cave_spider.walk_velocity = 1.3
|
|||
cave_spider.run_velocity = 3.2
|
||||
cave_spider.sounds = table.copy(spider.sounds)
|
||||
cave_spider.sounds.base_pitch = 1.25
|
||||
mobs:register_mob("mobs_mc:cave_spider", cave_spider)
|
||||
mcl_mobs:register_mob("mobs_mc:cave_spider", cave_spider)
|
||||
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:spider",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -239,9 +239,9 @@ mobs:spawn_specific(
|
|||
30,
|
||||
17000,
|
||||
2,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:spider", S("Spider"), "mobs_mc_spawn_icon_spider.png", 0)
|
||||
mobs:register_egg("mobs_mc:cave_spider", S("Cave Spider"), "mobs_mc_spawn_icon_cave_spider.png", 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)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
|
||||
mobs:register_mob("mobs_mc:squid", {
|
||||
mcl_mobs:register_mob("mobs_mc:squid", {
|
||||
description = S("Squid"),
|
||||
type = "animal",
|
||||
spawn_class = "water",
|
||||
|
@ -40,7 +40,7 @@ mobs:register_mob("mobs_mc:squid", {
|
|||
run_end = 60,
|
||||
},
|
||||
drops = {
|
||||
{name = mobs_mc.items.black_dye,
|
||||
{name = "mcl_dye:black",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 3,
|
||||
|
@ -49,7 +49,7 @@ mobs:register_mob("mobs_mc:squid", {
|
|||
visual_size = {x=3, y=3},
|
||||
makes_footstep_sound = false,
|
||||
fly = true,
|
||||
fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source },
|
||||
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
|
||||
breathes_in_water = true,
|
||||
jump = false,
|
||||
view_range = 16,
|
||||
|
@ -61,9 +61,9 @@ mobs:register_mob("mobs_mc:squid", {
|
|||
|
||||
-- Spawn near the water surface
|
||||
|
||||
local water = mobs_mc.spawn_height.water
|
||||
local water = mobs_mc.water_level
|
||||
--name, nodes, neighbours, minlight, maxlight, interval, chance, active_object_count, min_height, max_height
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:squid",
|
||||
"overworld",
|
||||
"water",
|
||||
|
@ -217,4 +217,4 @@ water-16,
|
|||
water+1)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:squid", S("Squid"), "mobs_mc_spawn_icon_squid.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:squid", S("Squid"), "mobs_mc_spawn_icon_squid.png", 0)
|
||||
|
|
Before Width: | Height: | Size: 606 B After Width: | Height: | Size: 385 B |
Before Width: | Height: | Size: 99 B After Width: | Height: | Size: 99 B |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 936 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 966 B |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 971 B |
Before Width: | Height: | Size: 866 B After Width: | Height: | Size: 989 B |
After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 848 B After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 950 B |
After Width: | Height: | Size: 933 B |
Before Width: | Height: | Size: 896 B After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1008 B |
Before Width: | Height: | Size: 768 B After Width: | Height: | Size: 921 B |
After Width: | Height: | Size: 983 B |
Before Width: | Height: | Size: 866 B After Width: | Height: | Size: 941 B |
After Width: | Height: | Size: 964 B |
After Width: | Height: | Size: 967 B |
|
@ -9,7 +9,7 @@ local S = minetest.get_translator("mobs_mc")
|
|||
--################### VEX
|
||||
--###################
|
||||
|
||||
mobs:register_mob("mobs_mc:vex", {
|
||||
mcl_mobs:register_mob("mobs_mc:vex", {
|
||||
description = S("Vex"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -94,4 +94,4 @@ mobs:register_mob("mobs_mc:vex", {
|
|||
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:vex", S("Vex"), "mobs_mc_spawn_icon_vex.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:vex", S("Vex"), "mobs_mc_spawn_icon_vex.png", 0)
|
||||
|
|
|
@ -10,14 +10,10 @@
|
|||
|
||||
-- TODO: Particles
|
||||
-- TODO: 4s Regeneration I after trade unlock
|
||||
-- TODO: Breeding
|
||||
-- TODO: Baby villagers
|
||||
-- TODO: Spawning in villages
|
||||
-- TODO: Behaviour:
|
||||
-- TODO: Walk around village, but do not leave it intentionally
|
||||
-- TODO: Run into house on rain or danger, open doors
|
||||
-- TODO: Internal inventory, pick up items, trade with other villagers
|
||||
-- TODO: Farm stuff
|
||||
-- TODO: Run into house on rain or danger, open doors
|
||||
-- TODO: Internal inventory, trade with other villagers
|
||||
-- TODO: Schedule stuff (work,sleep,father)
|
||||
|
||||
local S = minetest.get_translator("mobs_mc")
|
||||
local N = function(s) return s end
|
||||
|
@ -61,10 +57,38 @@ if minetest.get_mapgen_setting("mg_name") == "v6" then
|
|||
TRADE_V6_BIRCH_SAPLING = { { "mcl_core:emerald", 8, 11 }, { "mcl_core:birchsapling", 1, 1 } }
|
||||
end
|
||||
|
||||
local tiernames = {
|
||||
"Novice",
|
||||
"Apprentice",
|
||||
"Journeyman",
|
||||
"Expert",
|
||||
"Master",
|
||||
}
|
||||
|
||||
local badges = {
|
||||
"default_wood.png",
|
||||
"default_steel_block.png",
|
||||
"default_gold_block.png",
|
||||
"mcl_core_emerald_block.png",
|
||||
"default_diamond_block.png",
|
||||
}
|
||||
|
||||
local professions = {
|
||||
unemployed = {
|
||||
name = N("Unemployed"),
|
||||
textures = {
|
||||
"mobs_mc_villager.png",
|
||||
"mobs_mc_villager.png",
|
||||
},
|
||||
trades = nil,
|
||||
},
|
||||
farmer = {
|
||||
name = N("Farmer"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_farmer.png",
|
||||
"mobs_mc_villager_farmer.png",
|
||||
},
|
||||
jobsite = "mcl_composters:composter",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_farming:wheat_item", 18, 22, }, E1 },
|
||||
|
@ -76,16 +100,19 @@ local professions = {
|
|||
{
|
||||
{ { "mcl_farming:pumpkin", 8, 13 }, E1 },
|
||||
{ E1, { "mcl_farming:pumpkin_pie", 2, 3} },
|
||||
{ E1, { "mcl_core:apple", 2, 3} },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_farming:melon", 7, 12 }, E1 },
|
||||
{ E1, { "mcl_core:apple", 5, 7 }, },
|
||||
{ E1, {"mcl_farming:cookie", 5, 7 }, },
|
||||
},
|
||||
|
||||
{
|
||||
{ E1, { "mcl_farming:cookie", 6, 10 } },
|
||||
{ E1, { "mcl_cake:cake", 1, 1 } },
|
||||
{ E1, { "mcl_mushrooms:mushroom_stew", 6, 10 } }, --FIXME: expert level farmer is supposed to sell sus stews.
|
||||
},
|
||||
{
|
||||
{ E1, { "mcl_farming:carrot_item_gold", 3, 10 } },
|
||||
{ E1, { "mcl_potions:speckled_melon", 4, 1 } },
|
||||
TRADE_V6_BIRCH_SAPLING,
|
||||
TRADE_V6_DARK_OAK_SAPLING,
|
||||
TRADE_V6_ACACIA_SAPLING,
|
||||
|
@ -94,33 +121,91 @@ local professions = {
|
|||
},
|
||||
fisherman = {
|
||||
name = N("Fisherman"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_fisherman.png",
|
||||
"mobs_mc_villager_fisherman.png",
|
||||
},
|
||||
jobsite = "mcl_barrels:barrel_closed",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 }, { "mcl_fishing:fish_cooked", 6, 6 } },
|
||||
{ { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:fish_cooked", 6, 6 } },
|
||||
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
||||
{ { "mcl_core:emerald", 3, 11 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} },
|
||||
{ { "mcl_core:coal_lump", 15, 10 }, E1 },
|
||||
-- FIXME missing: bucket of cod + fish should be cod.
|
||||
},
|
||||
{
|
||||
{ { "mcl_fishing:fish_raw", 6, 15,}, E1 },
|
||||
{ { "mcl_fishing:salmon_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:salmon_cooked", 6, 6 } },
|
||||
-- FIXME missing campfire
|
||||
-- {{ "mcl_core:emerald", 1, 2 },{"mcl_campfires:campfire",1,1} },
|
||||
},
|
||||
{
|
||||
{ { "mcl_fishing:salmon_raw", 6, 13,}, E1 },
|
||||
{ { "mcl_core:emerald", 7, 22 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} },
|
||||
},
|
||||
{
|
||||
{ { "mcl_fishing:clownfish_raw", 6, 6,}, E1 },
|
||||
},
|
||||
{
|
||||
{ { "mcl_fishing:pufferfish_raw", 4, 4,}, E1 },
|
||||
|
||||
{ { "mcl_boats:boat", 1, 1,}, E1 },
|
||||
{ { "mcl_boats:boat_acacia", 1, 1,}, E1 },
|
||||
{ { "mcl_boats:boat_spruce", 1, 1,}, E1 },
|
||||
{ { "mcl_boats:boat_dark_oak", 1, 1,}, E1 },
|
||||
{ { "mcl_boats:boat_birch", 1, 1,}, E1 },
|
||||
},
|
||||
},
|
||||
},
|
||||
fletcher = {
|
||||
name = N("Fletcher"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_fletcher.png",
|
||||
"mobs_mc_villager_fletcher.png",
|
||||
},
|
||||
jobsite = "mcl_fletching_table:fletching_table",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:string", 15, 20 }, E1 },
|
||||
{ E1, { "mcl_bows:arrow", 8, 12 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:gravel", 10, 10, "mcl_core:emerald", 1, 1 }, { "mcl_core:flint", 6, 10 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:flint", 26, 26 }, E1 },
|
||||
{ { "mcl_core:emerald", 2, 3 }, { "mcl_bows:bow", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_mobitems:string", 14, 14 }, E1 },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_bows:crossbow", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_mobitems:string", 24, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 7, 21 } , { "mcl_bows:bow_enchanted", 1, 1 } },
|
||||
},
|
||||
{
|
||||
--FIXME: supposed to be tripwire hook{ { "tripwirehook", 24, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 8, 22 } , { "mcl_bows:crossbow_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:healing_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:harming_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:night_vision_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:swiftness_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:slowness_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:leaping_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:poison_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:regeneration_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:invisibility_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:water_breathing_arrow", 5, 5 } },
|
||||
{ { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:fire_resistance_arrow", 5, 5 } },
|
||||
},
|
||||
}
|
||||
},
|
||||
shepherd ={
|
||||
name = N("Shepherd"),
|
||||
texture = "mobs_mc_villager_farmer.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_sheperd.png",
|
||||
"mobs_mc_villager_sheperd.png",
|
||||
},
|
||||
jobsite = "mcl_loom:loom",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_wool:white", 16, 22 }, E1 },
|
||||
|
@ -149,180 +234,287 @@ local professions = {
|
|||
},
|
||||
librarian = {
|
||||
name = N("Librarian"),
|
||||
texture = "mobs_mc_villager_librarian.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_librarian.png",
|
||||
"mobs_mc_villager_librarian.png",
|
||||
},
|
||||
jobsite = "mcl_books:bookshelf", --FIXME: lectern
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:paper", 24, 36 }, E1 },
|
||||
{ { "mcl_books:book", 8, 10 }, E1 },
|
||||
{ { "mcl_core:emerald", 10, 12 }, { "mcl_compass:compass", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 3, 4 }, { "mcl_books:bookshelf", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 9, 9 }, { "mcl_books:bookshelf", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_books:written_book", 2, 2 }, E1 },
|
||||
{ { "mcl_core:emerald", 10, 12 }, { "mcl_clock:clock", 1, 1 } },
|
||||
{ E1, { "mcl_core:glass", 3, 5 } },
|
||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ E1, { "mcl_lanterns:lantern_floor", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ E1, { "mcl_core:glass", 3, 5 } },
|
||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ { "mcl_dye:black", 5, 5 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ E1, { "mcl_core:glass", 4, 4 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 5, 64 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ E1, { "mcl_books:writable_book", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_compass:compass", 1 ,1 }},
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_clock:clock", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 20, 22 }, { "mcl_mobs:nametag", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 20, 20 }, { "mcl_mobs:nametag", 1, 1 } },
|
||||
}
|
||||
},
|
||||
},
|
||||
cartographer = {
|
||||
name = N("Cartographer"),
|
||||
texture = "mobs_mc_villager_librarian.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_cartographer.png",
|
||||
"mobs_mc_villager_cartographer.png",
|
||||
},
|
||||
jobsite = "mcl_cartography_table:cartography_table",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:paper", 24, 36 }, E1 },
|
||||
{ { "mcl_core:paper", 24, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_maps:empty_map", 1, 1 } },
|
||||
},
|
||||
{
|
||||
-- compass subject to special checks
|
||||
{ { "xpanes:pane_natural_flat", 1, 1 }, E1 },
|
||||
--{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:ocean explorer map" 1, 1} },
|
||||
},
|
||||
|
||||
{
|
||||
-- subject to special checks
|
||||
{ { "mcl_compass:compass", 1, 1 }, E1 },
|
||||
--{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:woodland explorer map" 1, 1} },
|
||||
},
|
||||
|
||||
{
|
||||
-- TODO: replace with empty map
|
||||
{ { "mcl_core:emerald", 7, 11}, { "mcl_maps:filled_map", 1, 1 } },
|
||||
},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_itemframes:item_frame", 1, 1 }},
|
||||
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_white", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_grey", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_silver", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_black", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_red", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_green", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_cyan", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_blue", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_magenta", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_orange", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_purple", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_brown", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_pink", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_lime", 1, 1 }},
|
||||
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_light_blue", 1, 1 }},
|
||||
},
|
||||
{
|
||||
--{ { "mcl_core:emerald", 8, 8}, { "FIXME: globe banner pattern", 1, 1 } },
|
||||
},
|
||||
-- TODO: special maps
|
||||
},
|
||||
},
|
||||
armorer = {
|
||||
name = N("Armorer"),
|
||||
texture = "mobs_mc_villager_smith.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_armorer.png",
|
||||
"mobs_mc_villager_armorer.png",
|
||||
},
|
||||
jobsite = "mcl_blast_furnace:blast_furnace",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 4, 6 }, { "mcl_armor:helmet_iron", 1, 1 } },
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_iron", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 9, 9 }, { "mcl_armor:chestplate_iron", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:leggings_iron", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_iron", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 10, 14 }, { "mcl_armor:chestplate_iron", 1, 1 } },
|
||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 36, 36 }, { "mcl_bells:bell", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 1, 1 }, { "mcl_armor:boots_chain", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_buckets:bucket_lava", 1, 1 }, E1 },
|
||||
{ { "mcl_core:diamond", 1, 1 }, E1 },
|
||||
{ { "mcl_core:emerald", 1, 1 }, { "mcl_armor:helmet_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:chestplate_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_shields:shield", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 16, 19 }, { "mcl_armor:chestplate_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 19, 33 }, { "mcl_armor:leggings_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 13, 27 }, { "mcl_armor:boots_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_armor:boots_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 9, 11 }, { "mcl_armor:leggings_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_armor:helmet_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 11, 15 }, { "mcl_armor:chestplate_chain", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 13, 27 }, { "mcl_armor:helmet_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 21, 35 }, { "mcl_armor:chestplate_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
leatherworker = {
|
||||
name = N("Leatherworker"),
|
||||
texture = "mobs_mc_villager_butcher.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_leatherworker.png",
|
||||
"mobs_mc_villager_leatherworker.png",
|
||||
},
|
||||
jobsite = "mcl_cauldrons:cauldron",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:leather", 9, 12 }, E1 },
|
||||
{ { "mcl_core:emerald", 2, 4 }, { "mcl_armor:leggings_leather", 2, 4 } },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_leather", 2, 4 } },
|
||||
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 2, 4 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:emerald", 7, 12 }, { "mcl_armor:chestplate_leather_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:flint", 26, 26 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } },
|
||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_leather", 2, 4 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_mobitems:rabbit_hide", 9, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 1, 1 } },
|
||||
},
|
||||
{
|
||||
--{ { "FIXME: scute", 4, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 8, 10 }, { "mcl_mobitems:saddle", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:emerald", 6, 6 }, { "mcl_mobitems:saddle", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
butcher = {
|
||||
name = N("Butcher"),
|
||||
texture = "mobs_mc_villager_butcher.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_butcher.png",
|
||||
"mobs_mc_villager_butcher.png",
|
||||
},
|
||||
jobsite = "mcl_smoker:smoker",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:beef", 14, 18 }, E1 },
|
||||
{ { "mcl_mobitems:chicken", 14, 18 }, E1 },
|
||||
{ { "mcl_mobitems:beef", 14, 14 }, E1 },
|
||||
{ { "mcl_mobitems:chicken", 7, 7 }, E1 },
|
||||
{ { "mcl_mobitems:rabbit", 4, 4 }, E1 },
|
||||
{ E1, { "mcl_mobitems:rabbit_stew", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||
{ E1, { "mcl_mobitems:cooked_beef", 5, 7 } },
|
||||
{ E1, { "mcl_mobitems:cooked_chicken", 6, 8 } },
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ E1, { "mcl_mobitems:cooked_porkchop", 5, 5 } },
|
||||
{ E1, { "mcl_mobitems:cooked_chicken", 8, 8 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_mobitems:mutton", 7, 7 }, E1 },
|
||||
{ { "mcl_mobitems:beef", 10, 10 }, E1 },
|
||||
},
|
||||
{
|
||||
{ { "mcl_mobitems:mutton", 7, 7 }, E1 },
|
||||
{ { "mcl_mobitems:beef", 10, 10 }, E1 },
|
||||
},
|
||||
{
|
||||
--{ { "FIXME: Sweet Berries", 10, 10 }, E1 },
|
||||
},
|
||||
},
|
||||
},
|
||||
weapon_smith = {
|
||||
name = N("Weapon Smith"),
|
||||
texture = "mobs_mc_villager_smith.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_weaponsmith.png",
|
||||
"mobs_mc_villager_weaponsmith.png",
|
||||
},
|
||||
jobsite = "mcl_furnaces:furnace", --FIXME: grindstone
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 6, 8 }, { "mcl_tools:axe_iron", 1, 1 } },
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_tools:axe_iron", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 7, 21 }, { "mcl_tools:sword_iron_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 9, 10 }, { "mcl_tools:sword_iron_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 36, 36 }, { "mcl_bells:bell", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:flint", 7, 9 }, E1 },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:diamond", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 12, 15 }, { "mcl_tools:sword_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 9, 12 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 13, 27 }, { "mcl_tools:sword_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
tool_smith = {
|
||||
name = N("Tool Smith"),
|
||||
texture = "mobs_mc_villager_smith.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_toolsmith.png",
|
||||
"mobs_mc_villager_toolsmith.png",
|
||||
},
|
||||
jobsite = "mcl_anvils:anvil", --FIXME: smithing table
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_core:coal_lump", 16, 24 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 7 }, { "mcl_tools:shovel_iron_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:coal_lump", 15, 15 }, E1 },
|
||||
{ E1, { "mcl_tools:axe_stone", 1, 1 } },
|
||||
{ E1, { "mcl_tools:shovel_stone", 1, 1 } },
|
||||
{ E1, { "mcl_tools:pick_stone", 1, 1 } },
|
||||
{ E1, { "mcl_farming:hoe_stone", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:iron_ingot", 7, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 9, 11 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:iron_ingot", 4, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 36, 36 }, { "mcl_bells:bell", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_core:diamond", 3, 4 }, E1 },
|
||||
{ { "mcl_core:emerald", 12, 15 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:flint", 30, 30 }, E1 },
|
||||
{ { "mcl_core:emerald", 6, 20 }, { "mcl_tools:axe_iron_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 7, 21 }, { "mcl_tools:shovel_iron_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 8, 22 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 4, 4 }, { "mcl_farming:hoe_diamond", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:diamond", 1, 1 }, E1 },
|
||||
{ { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } },
|
||||
{ { "mcl_core:emerald", 10, 24 }, { "mcl_tools:shovel_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
{
|
||||
{ { "mcl_core:emerald", 18, 32 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } },
|
||||
},
|
||||
},
|
||||
},
|
||||
cleric = {
|
||||
name = N("Cleric"),
|
||||
texture = "mobs_mc_villager_priest.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_priest.png",
|
||||
"mobs_mc_villager_priest.png",
|
||||
},
|
||||
jobsite = "mcl_brewing:stand_000",
|
||||
trades = {
|
||||
{
|
||||
{ { "mcl_mobitems:rotten_flesh", 36, 40 }, E1 },
|
||||
{ { "mcl_core:gold_ingot", 8, 10 }, E1 },
|
||||
{ { "mcl_mobitems:rotten_flesh", 32, 32 }, E1 },
|
||||
{ E1, { "mesecons:redstone", 2, 2 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ E1, { "mesecons:redstone", 1, 4 } },
|
||||
{ E1, { "mcl_dye:blue", 1, 2 } },
|
||||
{ { "mcl_core:gold_ingot", 3, 3 }, E1 },
|
||||
{ E1, { "mcl_dye:blue", 1, 1 } },
|
||||
},
|
||||
|
||||
{
|
||||
{ E1, { "mcl_nether:glowstone", 1, 3 } },
|
||||
{ { "mcl_core:emerald", 4, 7 }, { "mcl_throwing:ender_pearl", 1, 1 } },
|
||||
{ { "mcl_mobitems:rabbit_foot", 2, 2 }, E1 },
|
||||
{ E1, { "mcl_nether:glowstone", 4, 4 } },
|
||||
},
|
||||
{
|
||||
--{ { "FIXME: scute", 4, 4 }, E1 },
|
||||
{ { "mcl_potions:glass_bottle", 9, 9 }, E1 },
|
||||
{ { "mcl_core:emerald", 5, 5 }, { "mcl_throwing:ender_pearl", 1, 1 } },
|
||||
TRADE_V6_RED_SANDSTONE,
|
||||
},
|
||||
|
||||
{
|
||||
{ { "mcl_nether:nether_wart_item", 22, 22 }, E1 },
|
||||
{ { "mcl_core:emerald", 3, 3 }, { "mcl_experience:bottle", 1, 1 } },
|
||||
|
@ -331,7 +523,10 @@ local professions = {
|
|||
},
|
||||
nitwit = {
|
||||
name = N("Nitwit"),
|
||||
texture = "mobs_mc_villager.png",
|
||||
textures = {
|
||||
"mobs_mc_villager_nitwit.png",
|
||||
"mobs_mc_villager_nitwit.png",
|
||||
},
|
||||
-- No trades for nitwit
|
||||
trades = nil,
|
||||
}
|
||||
|
@ -342,12 +537,106 @@ for id, _ in pairs(professions) do
|
|||
table.insert(profession_names, id)
|
||||
end
|
||||
|
||||
local stand_still = function(self)
|
||||
local jobsites={}
|
||||
for _,n in pairs(profession_names) do
|
||||
table.insert(jobsites,professions[n].jobsite)
|
||||
end
|
||||
|
||||
local function stand_still(self)
|
||||
self.walk_chance = 0
|
||||
self.jump = false
|
||||
end
|
||||
|
||||
local update_max_tradenum = function(self)
|
||||
local function init_trader_vars(self)
|
||||
if not self._max_trade_tier then
|
||||
self._max_trade_tier = 1
|
||||
end
|
||||
if not self._locked_trades then
|
||||
self._locked_trades = 0
|
||||
end
|
||||
if not self._trading_players then
|
||||
self._trading_players = {}
|
||||
end
|
||||
end
|
||||
|
||||
local function get_badge_textures(self)
|
||||
local t = professions[self._profession].textures
|
||||
if self._profession == "unemployed" or self._profession == "nitwit" then return t end
|
||||
local tier = self._max_trade_tier or 1
|
||||
return {
|
||||
"[combine:64x64:0,0="..t[1]..":11,55=".. badges[tier].."\\^[resize\\:2x2",
|
||||
t[2]
|
||||
}
|
||||
end
|
||||
|
||||
local function set_textures(self)
|
||||
self.object:set_properties({textures=get_badge_textures(self)})
|
||||
end
|
||||
|
||||
local function go_home(entity)
|
||||
entity.state = "go_home"
|
||||
local b=entity._bed
|
||||
if not b then return end
|
||||
mcl_mobs:gopath(entity,b,function(entity,b)
|
||||
if vector.distance(entity.object:get_pos(),b) < 2 then
|
||||
entity.state = "stand"
|
||||
set_velocity(entity,0)
|
||||
entity.object:set_pos(b)
|
||||
local n=minetest.get_node(b)
|
||||
if n and n.name ~= "mcl_beds:bed_red_bottom" then
|
||||
entity._bed=nil --the stormtroopers have killed uncle owen
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
----- JOBSITE LOGIC
|
||||
local function get_profession_by_jobsite(js)
|
||||
for k,v in pairs(professions) do
|
||||
if v.jobsite == js then return k end
|
||||
end
|
||||
end
|
||||
|
||||
local function employ(self,jobsite_pos)
|
||||
local n = minetest.get_node(jobsite_pos)
|
||||
local m = minetest.get_meta(jobsite_pos)
|
||||
local p = get_profession_by_jobsite(n.name)
|
||||
if p and m:get_string("villager") == "" then
|
||||
self._profession=p
|
||||
m:set_string("villager",self._id)
|
||||
self._jobsite = jobsite_pos
|
||||
set_textures(self)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local function look_for_job(self)
|
||||
local p = self.object:get_pos()
|
||||
local nn = minetest.find_nodes_in_area(vector.offset(p,-48,-48,-48),vector.offset(p,48,48,48),jobsites)
|
||||
for _,n in pairs(nn) do
|
||||
local m=minetest.get_meta(n)
|
||||
if m:get_string("villager") == "" then
|
||||
--minetest.log("goingt to jobsite "..minetest.pos_to_string(n) )
|
||||
local gp = mcl_mobs:gopath(self,n,function()
|
||||
--minetest.log("arrived jobsite "..minetest.pos_to_string(n) )
|
||||
end)
|
||||
if gp then return end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function get_a_job(self)
|
||||
local p = self.object:get_pos()
|
||||
local nn = minetest.find_nodes_in_area(vector.offset(p,-8,-8,-8),vector.offset(p,8,8,8),jobsites)
|
||||
for _,n in pairs(nn) do
|
||||
if n and employ(self,n) then return true end
|
||||
end
|
||||
if self.state ~= "gowp" then look_for_job(self) end
|
||||
end
|
||||
|
||||
local function update_max_tradenum(self)
|
||||
if not self._trades then
|
||||
return
|
||||
end
|
||||
|
@ -362,31 +651,7 @@ local update_max_tradenum = function(self)
|
|||
self._max_tradenum = #trades
|
||||
end
|
||||
|
||||
local init_trader_vars = function(self)
|
||||
if not self._profession then
|
||||
-- Select random profession from all professions with matching clothing
|
||||
local texture = self.base_texture[1]
|
||||
local matches = {}
|
||||
for prof_id, prof in pairs(professions) do
|
||||
if texture == prof.texture then
|
||||
table.insert(matches, prof_id)
|
||||
end
|
||||
end
|
||||
local p = math.random(1, #matches)
|
||||
self._profession = matches[p]
|
||||
end
|
||||
if not self._max_trade_tier then
|
||||
self._max_trade_tier = 1
|
||||
end
|
||||
if not self._locked_trades then
|
||||
self._locked_trades = 0
|
||||
end
|
||||
if not self._trading_players then
|
||||
self._trading_players = {}
|
||||
end
|
||||
end
|
||||
|
||||
local init_trades = function(self, inv)
|
||||
local function init_trades(self, inv)
|
||||
local profession = professions[self._profession]
|
||||
local trade_tiers = profession.trades
|
||||
if trade_tiers == nil then
|
||||
|
@ -437,7 +702,7 @@ local init_trades = function(self, inv)
|
|||
minetest.deserialize(self._trades)
|
||||
end
|
||||
|
||||
local set_trade = function(trader, player, inv, concrete_tradenum)
|
||||
local function set_trade(trader, player, inv, concrete_tradenum)
|
||||
local trades = minetest.deserialize(trader._trades)
|
||||
if not trades then
|
||||
init_trades(trader)
|
||||
|
@ -511,12 +776,17 @@ local function show_trade_formspec(playername, trader, tradenum)
|
|||
w2_formspec = "item_image[3,1;1,1;"..wanted2:to_string().."]"
|
||||
.."tooltip[3,1;0.8,0.8;"..F(wanted2:get_description()).."]"
|
||||
end
|
||||
|
||||
local tiername = tiernames[trader._max_trade_tier]
|
||||
if tiername then
|
||||
tiername = S(tiername)
|
||||
else
|
||||
tiername = S("Master")
|
||||
end
|
||||
local formspec =
|
||||
"size[9,8.75]"
|
||||
.."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]"
|
||||
..disabled_img
|
||||
.."label[4,0;"..F(minetest.colorize("#313131", S(profession))).."]"
|
||||
.."label[3,0;"..F(minetest.colorize("#313131", S(profession).." - "..tiername)) .."]"
|
||||
.."list[current_player;main;0,4.5;9,3;9]"
|
||||
.."list[current_player;main;0,7.74;9,1;]"
|
||||
..b_prev..b_next
|
||||
|
@ -536,7 +806,7 @@ local function show_trade_formspec(playername, trader, tradenum)
|
|||
minetest.show_formspec(playername, tradeinv_name, formspec)
|
||||
end
|
||||
|
||||
local update_offer = function(inv, player, sound)
|
||||
local function update_offer(inv, player, sound)
|
||||
local name = player:get_player_name()
|
||||
local trader = player_trading_with[name]
|
||||
local tradenum = player_tradenum[name]
|
||||
|
@ -560,12 +830,12 @@ local update_offer = function(inv, player, sound)
|
|||
-- compass.
|
||||
-- TODO: Remove these check functions when compass and clock are implemented
|
||||
-- as single items.
|
||||
local check_special = function(special_item, group, wanted1, wanted2, input1, input2)
|
||||
local function check_special(special_item, group, wanted1, wanted2, input1, input2)
|
||||
if minetest.registered_aliases[special_item] then
|
||||
special_item = minetest.registered_aliases[special_item]
|
||||
end
|
||||
if wanted1:get_name() == special_item then
|
||||
local check_input = function(input, wanted, group)
|
||||
local function check_input(input, wanted, group)
|
||||
return minetest.get_item_group(input:get_name(), group) ~= 0 and input:get_count() >= wanted:get_count()
|
||||
end
|
||||
if check_input(input1, wanted1, group) then
|
||||
|
@ -580,7 +850,7 @@ local update_offer = function(inv, player, sound)
|
|||
end
|
||||
-- Apply above function to all items which we consider special.
|
||||
-- This function succeeds if ANY item check succeeds.
|
||||
local check_specials = function(wanted1, wanted2, input1, input2)
|
||||
local function check_specials(wanted1, wanted2, input1, input2)
|
||||
return check_special(COMPASS, "compass", wanted1, wanted2, input1, input2)
|
||||
end
|
||||
-- END OF SPECIAL HANDLING OF COMPASS
|
||||
|
@ -634,7 +904,7 @@ local function return_item(itemstack, dropper, pos, inv_p)
|
|||
return itemstack
|
||||
end
|
||||
|
||||
local return_fields = function(player)
|
||||
local function return_fields(player)
|
||||
local name = player:get_player_name()
|
||||
local inv_t = minetest.get_inventory({type="detached", name = "mobs_mc:trade_"..name})
|
||||
local inv_p = player:get_inventory()
|
||||
|
@ -700,7 +970,7 @@ minetest.register_on_leaveplayer(function(player)
|
|||
end)
|
||||
|
||||
-- Return true if player is trading with villager, and the villager entity exists
|
||||
local trader_exists = function(playername)
|
||||
local function trader_exists(playername)
|
||||
local trader = player_trading_with[playername]
|
||||
return trader ~= nil and trader.object:get_luaentity() ~= nil
|
||||
end
|
||||
|
@ -727,7 +997,7 @@ local trade_inventory = {
|
|||
wanted1:set_count(wanted1:get_count()*2)
|
||||
wanted2:set_count(wanted2:get_count()*2)
|
||||
-- BEGIN OF SPECIAL HANDLING FOR COMPASS
|
||||
local special_checks = function(wanted1, input1, input2)
|
||||
local function special_checks(wanted1, input1, input2)
|
||||
if wanted1:get_name() == COMPASS then
|
||||
local compasses = 0
|
||||
if (minetest.get_item_group(input1:get_name(), "compass") ~= 0) then
|
||||
|
@ -844,6 +1114,10 @@ local trade_inventory = {
|
|||
-- First-time trade unlock all trades and unlock next trade tier
|
||||
if trade.tier + 1 > trader._max_trade_tier then
|
||||
trader._max_trade_tier = trader._max_trade_tier + 1
|
||||
if trader._max_trade_tier > 5 then
|
||||
trader._max_trade_tier = 5
|
||||
end
|
||||
set_textures(trader)
|
||||
update_max_tradenum(trader)
|
||||
update_formspec = true
|
||||
end
|
||||
|
@ -926,7 +1200,9 @@ end)
|
|||
|
||||
--[=======[ MOB REGISTRATION AND SPAWNING ]=======]
|
||||
|
||||
mobs:register_mob("mobs_mc:villager", {
|
||||
local pick_up = { "mcl_farming:bread", "mcl_farming:carrot_item", "mcl_farming:beetroot_item" , "mcl_farming:potato_item" }
|
||||
|
||||
mcl_mobs:register_mob("mobs_mc:villager", {
|
||||
description = S("Villager"),
|
||||
type = "npc",
|
||||
spawn_class = "passive",
|
||||
|
@ -936,31 +1212,9 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
visual = "mesh",
|
||||
mesh = "mobs_mc_villager.b3d",
|
||||
textures = {
|
||||
{
|
||||
"mobs_mc_villager.png",
|
||||
"mobs_mc_villager.png", --hat
|
||||
},
|
||||
{
|
||||
"mobs_mc_villager_farmer.png",
|
||||
"mobs_mc_villager_farmer.png", --hat
|
||||
},
|
||||
{
|
||||
"mobs_mc_villager_priest.png",
|
||||
"mobs_mc_villager_priest.png", --hat
|
||||
},
|
||||
{
|
||||
"mobs_mc_villager_librarian.png",
|
||||
"mobs_mc_villager_librarian.png", --hat
|
||||
},
|
||||
{
|
||||
"mobs_mc_villager_butcher.png",
|
||||
"mobs_mc_villager_butcher.png", --hat
|
||||
},
|
||||
{
|
||||
"mobs_mc_villager_smith.png",
|
||||
"mobs_mc_villager_smith.png", --hat
|
||||
},
|
||||
},
|
||||
visual_size = {x=2.75, y=2.75},
|
||||
makes_footstep_sound = true,
|
||||
walk_velocity = 1.2,
|
||||
|
@ -987,16 +1241,46 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
die_end = 220,
|
||||
die_loop = false,
|
||||
},
|
||||
follow = pick_up,
|
||||
nofollow = true,
|
||||
view_range = 16,
|
||||
fear_height = 4,
|
||||
jump = true,
|
||||
walk_chance = DEFAULT_WALK_CHANCE,
|
||||
_bed = nil,
|
||||
_id = nil,
|
||||
_profession = "unemployed",
|
||||
look_at_player = true,
|
||||
pick_up = pick_up,
|
||||
can_open_doors = true,
|
||||
on_pick_up = function(self,itementity)
|
||||
local clicker
|
||||
for _,p in pairs(minetest.get_connected_players()) do
|
||||
if vector.distance(p:get_pos(),self.object:get_pos()) < 10 then
|
||||
clicker = p
|
||||
end
|
||||
end
|
||||
if clicker then
|
||||
mcl_mobs:feed_tame(self, clicker, 1, true, false)
|
||||
return
|
||||
end
|
||||
return true --do not pick up
|
||||
end,
|
||||
on_rightclick = function(self, clicker)
|
||||
local trg=vector.new(0,9,0)
|
||||
if self._jobsite then
|
||||
mcl_mobs:gopath(self,self._jobsite,function()
|
||||
--minetest.log("arrived at jobsite")
|
||||
end)
|
||||
end
|
||||
if self.child or self._profession == "unemployed" then
|
||||
return
|
||||
end
|
||||
-- Initiate trading
|
||||
init_trader_vars(self)
|
||||
local name = clicker:get_player_name()
|
||||
self._trading_players[name] = true
|
||||
|
||||
init_trader_vars(self)
|
||||
if self._trades == nil then
|
||||
init_trades(self)
|
||||
end
|
||||
|
@ -1033,6 +1317,7 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
if not self._player_scan_timer then
|
||||
self._player_scan_timer = 0
|
||||
end
|
||||
|
||||
self._player_scan_timer = self._player_scan_timer + dtime
|
||||
-- Check infrequently to keep CPU load low
|
||||
if self._player_scan_timer > PLAYER_SCAN_INTERVAL then
|
||||
|
@ -1054,20 +1339,37 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
self.walk_chance = DEFAULT_WALK_CHANCE
|
||||
self.jump = true
|
||||
end
|
||||
if self._bed and ( self.state ~= "go_home" and vector.distance(self.object:get_pos(),self._bed) > 50 ) then
|
||||
go_home(self)
|
||||
end
|
||||
if self._profession == "unemployed" then
|
||||
get_a_job(self)
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
on_spawn = function(self)
|
||||
init_trader_vars(self)
|
||||
if self._id then
|
||||
set_textures(self)
|
||||
return
|
||||
end
|
||||
self._id=minetest.sha1(minetest.get_gametime()..minetest.pos_to_string(self.object:get_pos())..tostring(math.random()))
|
||||
self._profession = "unemployed"
|
||||
if math.random(100) == 1 then
|
||||
self._profession = "nitwit"
|
||||
end
|
||||
set_textures(self)
|
||||
end,
|
||||
on_die = function(self, pos)
|
||||
-- Close open trade formspecs and give input back to players
|
||||
local trading_players = self._trading_players
|
||||
for name, _ in pairs(trading_players) do
|
||||
minetest.close_formspec(name, "mobs_mc:trade_"..name)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
if player then
|
||||
return_fields(player)
|
||||
if trading_players then
|
||||
for name, _ in pairs(trading_players) do
|
||||
minetest.close_formspec(name, "mobs_mc:trade_"..name)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
if player then
|
||||
return_fields(player)
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
@ -1075,7 +1377,7 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
|
||||
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:villager",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -1102,8 +1404,8 @@ minetest.LIGHT_MAX+1,
|
|||
30,
|
||||
20,
|
||||
4,
|
||||
mobs_mc.spawn_height.water+1,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
mobs_mc.water_level+1,
|
||||
mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:villager", S("Villager"), "mobs_mc_spawn_icon_villager.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:villager", S("Villager"), "mobs_mc_spawn_icon_villager.png", 0)
|
||||
|
|
|
@ -11,7 +11,7 @@ local S = minetest.get_translator("mobs_mc")
|
|||
|
||||
local pr = PseudoRandom(os.time()*666)
|
||||
|
||||
mobs:register_mob("mobs_mc:evoker", {
|
||||
mcl_mobs:register_mob("mobs_mc:evoker", {
|
||||
description = S("Evoker"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -53,12 +53,12 @@ mobs:register_mob("mobs_mc:evoker", {
|
|||
shoot_interval = 15,
|
||||
passive = false,
|
||||
drops = {
|
||||
{name = mobs_mc.items.emerald,
|
||||
{name = "mcl_core:emerald",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 1,
|
||||
looting = "common",},
|
||||
{name = mobs_mc.items.totem,
|
||||
{name = "mcl_totems:totem",
|
||||
chance = 1,
|
||||
min = 1,
|
||||
max = 1,},
|
||||
|
@ -84,4 +84,4 @@ mobs:register_mob("mobs_mc:evoker", {
|
|||
})
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:evoker", S("Evoker"), "mobs_mc_spawn_icon_evoker.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:evoker", S("Evoker"), "mobs_mc_spawn_icon_evoker.png", 0)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
local S = minetest.get_translator("mobs_mc")
|
||||
local mod_bows = minetest.get_modpath("mcl_bows") ~= nil
|
||||
|
||||
mobs:register_mob("mobs_mc:illusioner", {
|
||||
mcl_mobs:register_mob("mobs_mc:illusioner", {
|
||||
description = S("Illusioner"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -61,4 +61,4 @@ mobs:register_mob("mobs_mc:illusioner", {
|
|||
fear_height = 4,
|
||||
})
|
||||
|
||||
mobs:register_egg("mobs_mc:illusioner", S("Illusioner"), "mobs_mc_spawn_icon_illusioner.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:illusioner", S("Illusioner"), "mobs_mc_spawn_icon_illusioner.png", 0)
|
||||
|
|
|
@ -10,7 +10,7 @@ local S = minetest.get_translator("mobs_mc")
|
|||
--###################
|
||||
|
||||
|
||||
mobs:register_mob("mobs_mc:vindicator", {
|
||||
mcl_mobs:register_mob("mobs_mc:vindicator", {
|
||||
description = S("Vindicator"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -39,12 +39,12 @@ mobs:register_mob("mobs_mc:vindicator", {
|
|||
run_velocity = 2.4,
|
||||
attack_type = "dogfight",
|
||||
drops = {
|
||||
{name = mobs_mc.items.emerald,
|
||||
{name = "mcl_core:emerald",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 1,
|
||||
looting = "common",},
|
||||
{name = mobs_mc.items.iron_axe,
|
||||
{name = "mcl_tools:axe_iron",
|
||||
chance = 100 / 8.5,
|
||||
min = 1,
|
||||
max = 1,
|
||||
|
@ -72,4 +72,4 @@ mobs:register_mob("mobs_mc:vindicator", {
|
|||
})
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:vindicator", S("Vindicator"), "mobs_mc_spawn_icon_vindicator.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:vindicator", S("Vindicator"), "mobs_mc_spawn_icon_vindicator.png", 0)
|
||||
|
|
|
@ -25,7 +25,7 @@ local professions = {
|
|||
nitwit = "mobs_mc_villager.png",
|
||||
}
|
||||
|
||||
mobs:register_mob("mobs_mc:villager_zombie", {
|
||||
mcl_mobs:register_mob("mobs_mc:villager_zombie", {
|
||||
description = S("Zombie Villager"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -55,24 +55,24 @@ mobs:register_mob("mobs_mc:villager_zombie", {
|
|||
attack_type = "dogfight",
|
||||
group_attack = true,
|
||||
drops = {
|
||||
{name = mobs_mc.items.rotten_flesh,
|
||||
{name = "mcl_mobitems:rotten_flesh",
|
||||
chance = 1,
|
||||
min = 0,
|
||||
max = 2,
|
||||
looting = "common",},
|
||||
{name = mobs_mc.items.iron_ingot,
|
||||
{name = "mcl_core:iron_ingot",
|
||||
chance = 120, -- 2.5% / 3
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "rare",
|
||||
looting_factor = 0.01 / 3,},
|
||||
{name = mobs_mc.items.carrot,
|
||||
{name = "mcl_farming:carrot_item",
|
||||
chance = 120, -- 2.5% / 3
|
||||
min = 1,
|
||||
max = 1,
|
||||
looting = "rare",
|
||||
looting_factor = 0.01 / 3,},
|
||||
{name = mobs_mc.items.potato,
|
||||
{name = "mcl_farming:potato_item",
|
||||
chance = 120, -- 2.5% / 3
|
||||
min = 1,
|
||||
max = 1,
|
||||
|
@ -147,7 +147,7 @@ mobs:register_mob("mobs_mc:villager_zombie", {
|
|||
harmed_by_heal = true,
|
||||
})
|
||||
|
||||
mobs:spawn_specific(
|
||||
mcl_mobs:spawn_specific(
|
||||
"mobs_mc:villager_zombie",
|
||||
"overworld",
|
||||
"ground",
|
||||
|
@ -237,9 +237,9 @@ mobs:spawn_specific(
|
|||
30,
|
||||
4090,
|
||||
4,
|
||||
mobs_mc.spawn_height.overworld_min,
|
||||
mobs_mc.spawn_height.overworld_max)
|
||||
--mobs:spawn_specific("mobs_mc:villager_zombie", "overworld", "ground", 0, 7, 30, 60000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
|
||||
mcl_vars.mg_overworld_min,
|
||||
mcl_vars.mg_overworld_max)
|
||||
--mcl_mobs:spawn_specific("mobs_mc:villager_zombie", "overworld", "ground", 0, 7, 30, 60000, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:villager_zombie", S("Zombie Villager"), "mobs_mc_spawn_icon_zombie_villager.png", 0)
|
||||
mcl_mobs:register_egg("mobs_mc:villager_zombie", S("Zombie Villager"), "mobs_mc_spawn_icon_zombie_villager.png", 0)
|
||||
|
|
|
@ -12,7 +12,7 @@ local S = minetest.get_translator("mobs_mc")
|
|||
|
||||
|
||||
|
||||
mobs:register_mob("mobs_mc:witch", {
|
||||
mcl_mobs:register_mob("mobs_mc:witch", {
|
||||
description = S("Witch"),
|
||||
type = "monster",
|
||||
spawn_class = "hostile",
|
||||
|
@ -42,13 +42,13 @@ mobs:register_mob("mobs_mc:witch", {
|
|||
dogshoot_count_max =1.8,
|
||||
max_drops = 3,
|
||||
drops = {
|
||||
{name = mobs_mc.items.glass_bottle, chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = mobs_mc.items.glowstone_dust, chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = mobs_mc.items.gunpowder, chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = mobs_mc.items.redstone, chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = mobs_mc.items.spider_eye, chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = mobs_mc.items.sugar, chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = mobs_mc.items.stick, chance = 4, min = 0, max = 2, looting = "common",},
|
||||
{name = "mcl_potions:glass_bottle", chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = "mcl_nether:glowstone_dust", chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = "mcl_mobitems:gunpowder", chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = "mesecons:redstone", chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = "mcl_mobitems:spider_eye", chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = "mcl_core:sugar", chance = 8, min = 0, max = 2, looting = "common",},
|
||||
{name = "mcl_core:stick", chance = 4, min = 0, max = 2, looting = "common",},
|
||||
},
|
||||
-- TODO: sounds
|
||||
animation = {
|
||||
|
@ -72,7 +72,7 @@ mobs:register_mob("mobs_mc:witch", {
|
|||
})
|
||||
|
||||
-- potion projectile (EXPERIMENTAL)
|
||||
mobs:register_arrow("mobs_mc:potion_arrow", {
|
||||
mcl_mobs:register_arrow("mobs_mc:potion_arrow", {
|
||||
visual = "sprite",
|
||||
visual_size = {x = 0.5, y = 0.5},
|
||||
--textures = {"vessels_glass_bottle.png"}, --TODO fix to else if default
|
||||
|
@ -101,9 +101,9 @@ mobs:register_arrow("mobs_mc:potion_arrow", {
|
|||
})
|
||||
|
||||
-- TODO: Spawn when witch works properly <- eventually -j4i
|
||||
--mobs:spawn_specific("mobs_mc:witch", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX-6, 12, 20000, 2, mobs_mc.spawn_height.water-6, mobs_mc.spawn_height.overworld_max)
|
||||
--mcl_mobs:spawn_specific("mobs_mc:witch", { "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern", "mcl_core:vine" }, {"air"}, 0, minetest.LIGHT_MAX-6, 12, 20000, 2, mobs_mc.water_level-6, mcl_vars.mg_overworld_max)
|
||||
|
||||
-- spawn eggs
|
||||
mobs:register_egg("mobs_mc:witch", S("Witch"), "mobs_mc_spawn_icon_witch.png", 0, true)
|
||||
mcl_mobs:register_egg("mobs_mc:witch", S("Witch"), "mobs_mc_spawn_icon_witch.png", 0, true)
|
||||
|
||||
mcl_wip.register_wip_item("mobs_mc:witch")
|
||||
|
|