grymlahv

eater component lua

Jun 29th, 2020
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.82 KB | None | 0 0
  1. local function clearcaneat(self, caneat)
  2. for i, v in ipairs(caneat) do
  3. self.inst:RemoveTag((type(v) == "table" and v.name or v).."_eater")
  4. end
  5. end
  6.  
  7. local function oncaneat(self, caneat, old_caneat)
  8. if old_caneat ~= nil then
  9. clearcaneat(self, old_caneat)
  10. end
  11. if caneat ~= nil then
  12. for i, v in ipairs(caneat) do
  13. self.inst:AddTag((type(v) == "table" and v.name or v).."_eater")
  14. end
  15. end
  16. end
  17.  
  18. local Eater = Class(function(self, inst)
  19. self.inst = inst
  20. self.eater = false
  21. self.strongstomach = false
  22. self.preferseating = { FOODGROUP.OMNI }
  23. --self.perferseatingtags = nil
  24. self.caneat = { FOODGROUP.OMNI }
  25. self.oneatfn = nil
  26. self.lasteattime = nil
  27. self.ignoresspoilage = false
  28. self.eatwholestack = false
  29. --[[
  30. --can be overridden by prefabs
  31. self.stale_hunger = nil
  32. self.stale_health = nil
  33. self.spoiled_hunger = nil
  34. self.spoiled_health = nil
  35. ]]
  36. self.healthabsorption = 1
  37. self.hungerabsorption = 1
  38. self.sanityabsorption = 1
  39.  
  40. --set to false to disable cached tags
  41. --self.cacheedibletags = nil
  42. end,
  43. nil,
  44. {
  45. caneat = oncaneat,
  46. })
  47.  
  48. function Eater:OnRemoveFromEntity()
  49. clearcaneat(self, self.caneat)
  50. end
  51.  
  52. function Eater:SetDiet(caneat, preferseating)
  53. self.caneat = caneat
  54. self.preferseating = preferseating or caneat
  55. end
  56.  
  57. function Eater:SetAbsorptionModifiers(health, hunger, sanity)
  58. self.healthabsorption = health
  59. self.hungerabsorption = hunger
  60. self.sanityabsorption = sanity
  61. end
  62.  
  63. function Eater:TimeSinceLastEating()
  64. return self.lasteattime ~= nil and GetTime() - self.lasteattime or nil
  65. end
  66.  
  67. function Eater:HasBeen(time)
  68. return self.lasteattime == nil or self:TimeSinceLastEating() >= time
  69. end
  70.  
  71. function Eater:OnSave()
  72. return self.lasteattime ~= nil
  73. and {
  74. time_since_eat = self:TimeSinceLastEating(),
  75. }
  76. or nil
  77. end
  78.  
  79. function Eater:OnLoad(data)
  80. if data.time_since_eat then
  81. self.lasteattime = GetTime() - data.time_since_eat
  82. end
  83. end
  84.  
  85. function Eater:SetCanEatHorrible()
  86. table.insert(self.preferseating, FOODTYPE.HORRIBLE)
  87. table.insert(self.caneat, FOODTYPE.HORRIBLE)
  88. self.inst:AddTag(FOODTYPE.HORRIBLE.."_eater")
  89. end
  90.  
  91. function Eater:SetCanEatGears()
  92. table.insert(self.preferseating, FOODTYPE.GEARS)
  93. table.insert(self.caneat, FOODTYPE.GEARS)
  94. self.inst:AddTag(FOODTYPE.GEARS.."_eater")
  95. end
  96.  
  97. function Eater:SetCanEatRaw()
  98. table.insert(self.preferseating, FOODTYPE.RAW)
  99. table.insert(self.caneat, FOODTYPE.RAW)
  100. self.inst:AddTag(FOODTYPE.RAW.."_eater")
  101. end
  102.  
  103. function Eater:SetPrefersEatingTag(tag)
  104. if self.preferseatingtags == nil then
  105. self.preferseatingtags = { tag }
  106. else
  107. table.insert(self.preferseatingtags, tag)
  108. end
  109. end
  110.  
  111. function Eater:SetOnEatFn(fn)
  112. self.oneatfn = fn
  113. end
  114.  
  115. function Eater:DoFoodEffects(food)
  116. return not ((self.strongstomach and food:HasTag("monstermeat")) or
  117. (self.inst.components.foodaffinity and self.inst.components.foodaffinity:HasPrefabAffinity(food)))
  118. end
  119.  
  120. function Eater:GetEdibleTags()
  121. if self.cacheedibletags then
  122. return self.cacheedibletags
  123. end
  124.  
  125. local tags = {}
  126. for i, v in ipairs(self.caneat) do
  127. if type(v) == "table" then
  128. for i2, v2 in ipairs(v.types) do
  129. table.insert(tags, "edible_"..v2)
  130. end
  131. else
  132. table.insert(tags, "edible_"..v)
  133. end
  134. end
  135.  
  136. if self.cacheedibletags ~= false then
  137. self.cacheedibletags = tags
  138. end
  139. return tags
  140. end
  141.  
  142. function Eater:Eat(food, feeder)
  143. feeder = feeder or self.inst
  144. -- This used to be CanEat. The reason for two checks is to that special diet characters (e.g.
  145. -- wigfrid) can TRY to eat all foods (they get the actions for it) but upon actually put it in
  146. -- their mouth, they bail and "spit it out" so to speak.
  147. if self:PrefersToEat(food) then
  148. local stack_mult = self.eatwholestack and food.components.stackable ~= nil and food.components.stackable:StackSize() or 1
  149. local base_mult = self.inst.components.foodmemory ~= nil and self.inst.components.foodmemory:GetFoodMultiplier(food.prefab) or 1
  150.  
  151. if self.inst.components.health ~= nil and
  152. (food.components.edible.healthvalue >= 0 or self:DoFoodEffects(food)) then
  153. local delta = food.components.edible:GetHealth(self.inst) * base_mult * self.healthabsorption
  154. if delta ~= 0 then
  155. self.inst.components.health:DoDelta(delta * stack_mult, nil, food.prefab)
  156. end
  157. end
  158.  
  159. if self.inst.components.hunger ~= nil then
  160. local delta = food.components.edible:GetHunger(self.inst) * base_mult * self.hungerabsorption
  161. if delta ~= 0 then
  162. self.inst.components.hunger:DoDelta(delta * stack_mult)
  163. end
  164. end
  165.  
  166. if self.inst.components.sanity ~= nil and
  167. (food.components.edible.sanityvalue >= 0 or self:DoFoodEffects(food)) then
  168. local delta = food.components.edible:GetSanity(self.inst) * base_mult * self.sanityabsorption
  169. if delta ~= 0 then
  170. self.inst.components.sanity:DoDelta(delta * stack_mult)
  171. end
  172. end
  173.  
  174. if feeder ~= self.inst and self.inst.components.inventoryitem ~= nil then
  175. local owner = self.inst.components.inventoryitem:GetGrandOwner()
  176. if owner ~= nil and
  177. ( owner == feeder
  178. or (owner.components.container ~= nil and
  179. owner.components.container.opener == feeder) ) then
  180. feeder:PushEvent("feedincontainer")
  181. end
  182. end
  183.  
  184. self.inst:PushEvent("oneat", { food = food, feeder = feeder })
  185. if self.oneatfn ~= nil then
  186. self.oneatfn(self.inst, food)
  187. end
  188.  
  189. if food.components.edible ~= nil then
  190. food.components.edible:OnEaten(self.inst)
  191. end
  192.  
  193. if food:IsValid() then --might get removed in OnEaten...
  194. if not self.eatwholestack and food.components.stackable ~= nil then
  195. food.components.stackable:Get():Remove()
  196. else
  197. food:Remove()
  198. end
  199. end
  200.  
  201. self.lasteattime = GetTime()
  202.  
  203. if self.inst.components.foodmemory ~= nil and not food:HasTag("potion") then
  204. self.inst.components.foodmemory:RememberFood(food.prefab)
  205. end
  206.  
  207. return true
  208. end
  209. end
  210.  
  211. function Eater:TestFood(food, testvalues)
  212. if food ~= nil and food.components.edible ~= nil then
  213. for i, v in ipairs(testvalues) do
  214. if type(v) == "table" then
  215. for i2, v2 in ipairs(v.types) do
  216. if food:HasTag("edible_"..v2) then
  217. return true
  218. end
  219. end
  220. elseif food:HasTag("edible_"..v) then
  221. return true
  222. end
  223. end
  224. end
  225. end
  226.  
  227. function Eater:PrefersToEat(inst)
  228. if inst.prefab == "winter_food4" and self.inst:HasTag("player") then
  229. --V2C: fruitcake hack. see how long this code stays untouched - _-"
  230. return false
  231. elseif self.preferseatingtags ~= nil then
  232. --V2C: now it has the warly hack for only eating prepared foods ;-D
  233. local preferred = false
  234. for i, v in ipairs(self.preferseatingtags) do
  235. if inst:HasTag(v) then
  236. preferred = true
  237. break
  238. end
  239. end
  240. if not preferred then
  241. return false
  242. end
  243. end
  244. return self:TestFood(inst, self.preferseating)
  245. end
  246.  
  247. function Eater:CanEat(inst)
  248. return self:TestFood(inst, self.caneat)
  249. end
  250.  
  251. return Eater
Advertisement
Add Comment
Please, Sign In to add comment