mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-26 12:31:05 +01:00
Make horse taming more similar to minecraft (#1249)
In minecraft horses are tamed by trying to ride them and they can also be fed to speed up taming. This commit implements both of those features and disables the old and broken taming system for horses.
This commit is contained in:
parent
f54f4ebcf9
commit
c5e1734c1c
1 changed files with 70 additions and 4 deletions
|
@ -157,8 +157,29 @@ local horse = {
|
||||||
self._regentimer = 0
|
self._regentimer = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
-- if driver present allow control of 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})
|
||||||
|
-- TODO bucking animation
|
||||||
|
else
|
||||||
|
-- Nah, can't be bothered. Think about it again in one second
|
||||||
|
self.buck_off_time = 20
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Tick the timer for trying to buck the player off
|
||||||
|
if self.buck_off_time then
|
||||||
if self.driver then
|
if self.driver then
|
||||||
|
self.buck_off_time = self.buck_off_time - 1
|
||||||
|
else
|
||||||
|
-- Player isn't riding anymore so no need to count
|
||||||
|
self.buck_off_time = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 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)
|
mobs.drive(self, "walk", "stand", false, dtime)
|
||||||
|
|
||||||
|
@ -191,6 +212,50 @@ local horse = {
|
||||||
local item = clicker:get_wielded_item()
|
local item = clicker:get_wielded_item()
|
||||||
local iname = item:get_name()
|
local iname = item:get_name()
|
||||||
local heal = 0
|
local heal = 0
|
||||||
|
|
||||||
|
-- Taming
|
||||||
|
self.temper = self.temper or (math.random(1,100))
|
||||||
|
|
||||||
|
if not self.tamed then
|
||||||
|
local temper_increase = 0
|
||||||
|
|
||||||
|
-- Feeding, intentionally not using mobs:feed_tame because horse taming is
|
||||||
|
-- different and more complicated
|
||||||
|
if (iname == mobs_mc.items.sugar) then
|
||||||
|
temper_increase = 3
|
||||||
|
elseif (iname == mobs_mc.items.wheat) then
|
||||||
|
temper_increase = 3
|
||||||
|
elseif (iname == mobs_mc.items.apple) then
|
||||||
|
temper_increase = 3
|
||||||
|
elseif (iname == mobs_mc.items.golden_carrot) then
|
||||||
|
temper_increase = 5
|
||||||
|
elseif (iname == mobs_mc.items.golden_apple) then
|
||||||
|
temper_increase = 10
|
||||||
|
|
||||||
|
-- Trying to ride
|
||||||
|
elseif not self.driver then
|
||||||
|
self.object:set_properties({stepheight = 1.1})
|
||||||
|
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
|
||||||
|
if not self.owner or self.owner == "" then
|
||||||
|
self.owner = clicker:get_player_name()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
temper_increase = 5
|
||||||
|
|
||||||
|
-- Clicking on the horse while riding ==> unmount
|
||||||
|
elseif self.driver and self.driver == clicker then
|
||||||
|
mobs.detach(clicker, {x = 1, y = 0, z = 1})
|
||||||
|
end
|
||||||
|
|
||||||
|
-- If nothing happened temper_increase = 0 and addition does nothing
|
||||||
|
self.temper = self.temper + temper_increase
|
||||||
|
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if can_breed(self.name) then
|
if can_breed(self.name) then
|
||||||
-- Breed horse with golden apple or golden carrot
|
-- Breed horse with golden apple or golden carrot
|
||||||
if (iname == mobs_mc.items.golden_apple) then
|
if (iname == mobs_mc.items.golden_apple) then
|
||||||
|
@ -202,7 +267,8 @@ local horse = {
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Feed/tame with anything else
|
-- Feed with anything else
|
||||||
|
-- TODO heal amounts don't work
|
||||||
if (iname == mobs_mc.items.sugar) then
|
if (iname == mobs_mc.items.sugar) then
|
||||||
heal = 1
|
heal = 1
|
||||||
elseif (iname == mobs_mc.items.wheat) then
|
elseif (iname == mobs_mc.items.wheat) then
|
||||||
|
@ -212,7 +278,7 @@ local horse = {
|
||||||
elseif (iname == mobs_mc.items.hay_bale) then
|
elseif (iname == mobs_mc.items.hay_bale) then
|
||||||
heal = 20
|
heal = 20
|
||||||
end
|
end
|
||||||
if heal > 0 and mobs:feed_tame(self, clicker, heal, false, true) then
|
if heal > 0 and mobs:feed_tame(self, clicker, heal, false, false) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue