From 6fc654947c93895f2261abf1dbe984299a847a3e Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sun, 11 Nov 2012 11:47:53 +0100 Subject: [PATCH] Add farming mod --- mods/farming/README.txt | 45 ++ mods/farming/depends.txt | 1 + mods/farming/init.lua | 480 ++++++++++++++++++ mods/farming/textures/farming_bread.png | Bin 0 -> 559 bytes mods/farming/textures/farming_flour.png | Bin 0 -> 264 bytes mods/farming/textures/farming_soil.png | Bin 0 -> 883 bytes mods/farming/textures/farming_soil_wet.png | Bin 0 -> 823 bytes .../textures/farming_soil_wet_side.png | Bin 0 -> 889 bytes .../textures/farming_tool_steelhoe.png | Bin 0 -> 331 bytes .../textures/farming_tool_stonehoe.png | Bin 0 -> 362 bytes .../farming/textures/farming_tool_woodhoe.png | Bin 0 -> 285 bytes mods/farming/textures/farming_wheat.png | Bin 0 -> 496 bytes mods/farming/textures/farming_wheat_1.png | Bin 0 -> 116 bytes mods/farming/textures/farming_wheat_2.png | Bin 0 -> 176 bytes mods/farming/textures/farming_wheat_3.png | Bin 0 -> 301 bytes mods/farming/textures/farming_wheat_4.png | Bin 0 -> 410 bytes mods/farming/textures/farming_wheat_5.png | Bin 0 -> 471 bytes mods/farming/textures/farming_wheat_6.png | Bin 0 -> 605 bytes mods/farming/textures/farming_wheat_7.png | Bin 0 -> 585 bytes mods/farming/textures/farming_wheat_8.png | Bin 0 -> 680 bytes 20 files changed, 526 insertions(+) create mode 100644 mods/farming/README.txt create mode 100644 mods/farming/depends.txt create mode 100644 mods/farming/init.lua create mode 100644 mods/farming/textures/farming_bread.png create mode 100644 mods/farming/textures/farming_flour.png create mode 100644 mods/farming/textures/farming_soil.png create mode 100644 mods/farming/textures/farming_soil_wet.png create mode 100644 mods/farming/textures/farming_soil_wet_side.png create mode 100644 mods/farming/textures/farming_tool_steelhoe.png create mode 100644 mods/farming/textures/farming_tool_stonehoe.png create mode 100644 mods/farming/textures/farming_tool_woodhoe.png create mode 100644 mods/farming/textures/farming_wheat.png create mode 100644 mods/farming/textures/farming_wheat_1.png create mode 100644 mods/farming/textures/farming_wheat_2.png create mode 100644 mods/farming/textures/farming_wheat_3.png create mode 100644 mods/farming/textures/farming_wheat_4.png create mode 100644 mods/farming/textures/farming_wheat_5.png create mode 100644 mods/farming/textures/farming_wheat_6.png create mode 100644 mods/farming/textures/farming_wheat_7.png create mode 100644 mods/farming/textures/farming_wheat_8.png diff --git a/mods/farming/README.txt b/mods/farming/README.txt new file mode 100644 index 00000000..fc81b85e --- /dev/null +++ b/mods/farming/README.txt @@ -0,0 +1,45 @@ +Minetest 0.4 mod: farming +========================= + +License of source code: +----------------------- +Copyright (C) 2012 PilzAdam + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + +License of media (textures): +---------------------------- +Created by PilzAdam (License: WTFPL): + farming_bread.png + farming_soil.png + farming_soil_wet.png + farming_soil_wet_side.png + +Created by Calinou (License: CC BY-SA): + farming_tool_steelhoe.png + farming_tool_stonehoe.png + farming_tool_woodhoe.png + +Created by RealBadAngel (License: WTFPL): + farming_flour.png + farming_wheat.png + farming_wheat_1.png + farming_wheat_2.png + farming_wheat_3.png + farming_wheat_4.png + farming_wheat_5.png + farming_wheat_5.png + farming_wheat_7.png + farming_wheat_8.png diff --git a/mods/farming/depends.txt b/mods/farming/depends.txt new file mode 100644 index 00000000..4ad96d51 --- /dev/null +++ b/mods/farming/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/farming/init.lua b/mods/farming/init.lua new file mode 100644 index 00000000..60398cbf --- /dev/null +++ b/mods/farming/init.lua @@ -0,0 +1,480 @@ +-- Minetest 0.4 mod: farming +-- See README.txt for licensing and other information. + +-- Groups defined in this mod: +-- plant: 1 = full grown; higher numbers = less grown +-- soil: 1 = wet; 2 = dry + +-- store all the functions in a global table +farming = {} + +-- contains all the registered plants ordered by the name +farming.registered_plants = {} + +-- contains all the seeds that can be dropped by plowing grass +-- this table is extended automatically by register_plant() +local seeds = {} + +-- defines all items and nodes that are needed to farm the plant +-- def should define these fields: +-- +-- plant_textures: a list with the textures for the plants +-- +-- seed_description: the tooltip of the seed +-- not needed if plant_harvested is true +-- seed_texture: the texture of the seed +-- not needed if plant_harvested is true +-- seed_rarity: a list with the inverted chance to get one more seed +-- not needed if plant_harvested is true +-- +-- plant_harvested: if true there are no seeds and you plant the plant by +-- placing the harvested item on soil +-- plowing_rarity: inverted chance to get the seed when plowing grass +-- +-- item_description: the tooltip of the harvested item +-- item_texture: the texture of the harvested item +-- item_rarity: a list with the inverted chance to get one more item +-- +-- growing_intervals: number of 60 sec intervals to the next growing step +-- note: there are cases where single intervals are skipped +-- growing_light: the light value the plant needs to grow +function farming:register_plant(name, def) + + -- add it to the registered_plants table + farming.registered_plants[name] = def + + -- places the seed if the player points at soil + local function place_seed(itemstack, placer, pointed_thing) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return + end + if pt.type ~= "node" then + return + end + + local under = minetest.env:get_node(pt.under) + local above = minetest.env:get_node(pt.above) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + if not minetest.registered_nodes[above.name] then + return + end + + -- check if pointing at the top of the node + if pt.above.y ~= pt.under.y+1 then + return + end + + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return + end + + -- check if pointing at soil + if minetest.get_item_group(under.name, "soil") == 0 then + return + end + + -- add the node and remove 1 item from the itemstack + minetest.env:add_node(pt.above, {name=name.."_1"}) + itemstack:take_item() + return itemstack + end + + if def.plant_harvested then + -- add the harvested item to the seeds table if its not 0 + if def.plowing_rarity ~= 0 then + table.insert(seeds, {name=name, rarity=def.plowing_rarity}) + end + + -- register the harvested item + minetest.register_craftitem(name, { + description = def.item_description, + inventory_image = def.item_texture, + on_place = place_seed, + }) + else + -- register the seed + minetest.register_craftitem(name.."_seed", { + description = def.seed_description, + inventory_image = def.seed_texture, + on_place = place_seed, + }) + + -- add the seed to the seeds table if its not 0 + if def.plowing_rarity ~= 0 then + table.insert(seeds, {name=name.."_seed", rarity=def.plowing_rarity}) + end + + -- register the harvested item + minetest.register_craftitem(name, { + description = def.item_description, + inventory_image = def.item_texture, + }) + end + + -- register the growing states + local i + local growing_states = {} -- contains the names of the nodes + for i=1, #def.plant_textures-1 do + local plant_state = #def.plant_textures-i+1 + local drop = "" + -- if its the last growing state drop seeds with a rarity of 30% + if plant_state == 2 then + if def.plant_harvested then + drop = { + items = { + {items ={name}, rarity = 3} + } + } + else + drop = { + items = { + {items ={name.."_seed"}, rarity = 3} + } + } + end + end + + minetest.register_node(name.."_"..i, { + drawtype = "plantlike", + tiles = {def.plant_textures[i]}, + paramtype = "light", + walkable = false, + drop = drop, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {snappy=3, flammable=2, not_in_creative_inventory=1, plant=plant_state}, + sounds = default.node_sound_leaves_defaults(), + }) + table.insert(growing_states, name.."_"..i) + end + + -- add the drops from the definition table to the drop table for the node + local drop = { items = {} } + for _,rarity in ipairs(def.item_rarity) do + if rarity ~= 0 then + table.insert(drop.items, {items={name}, rarity=rarity}) + end + end + if not def.plant_harvested then + for _,rarity in ipairs(def.seed_rarity) do + if rarity ~= 0 then + table.insert(drop.items, {items={name.."_seed"}, rarity=rarity}) + end + end + end + + -- register the full grown state + i = #def.plant_textures + + minetest.register_node(name.."_"..i, { + drawtype = "plantlike", + tiles = {def.plant_textures[i]}, + paramtype = "light", + walkable = false, + drop = drop, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {snappy=3, flammable=2, not_in_creative_inventory=1, plant=1}, + sounds = default.node_sound_leaves_defaults(), + }) + + -- register the growing abm + minetest.register_abm({ + nodenames = growing_states, + neighbors = {"group:soil"}, + interval = 60, + chance = 1, + action = function(pos, node) + -- return with a probability of 15% + if math.random(1, 100) <= 15 then + return + end + + -- check if on wet soil + pos.y = pos.y-1 + local n = minetest.env:get_node(pos) + if minetest.get_item_group(n.name, "soil") ~= 1 then + return + end + pos.y = pos.y+1 + + -- check light + if not minetest.env:get_node_light(pos) then + return + end + if minetest.env:get_node_light(pos) < def.growing_light then + return + end + + -- get the number of 60 sec intervals the node has passed + local meta = minetest.env:get_meta(pos) + local intervals = meta:get_int("farming_grow_intervals") + + -- increase it and look if its the wanted value + intervals = intervals+1 + meta:set_int("farming_grow_intervals", intervals) + if intervals < def.growing_intervals then + return + end + + -- grow + farming:grow_plant(pos) + end + }) + +end + +-- let a plant grow; this does not check light or something like that so +-- it can be used for fertilizer +-- returns: the number of states until full grown (after this function) +function farming:grow_plant(pos) + local node = minetest.env:get_node(pos) + local name = string.sub(node.name, 1, #node.name-2) + + -- if this node is not registered + if not farming.registered_plants[name] then + return 0 + end + + -- get the current grow state + local state = minetest.get_item_group(node.name, "plant") + + -- if the node is not a plant + if not state or state == 0 then + return 0 + end + + -- return if the node is full grown + if state == 1 then + return 0 + end + + -- get the nodenumber from the growing state + local i = -state+#farming.registered_plants[name].plant_textures+1 + + -- replace the node with the next growing state + minetest.env:set_node(pos, {name=name.."_"..i+1}) + return state-2 +end + +-- +-- Hoes +-- + +-- turns dirt and grass into soil; drop seeds if plowing grass +local function hoe_on_use(itemstack, user, pointed_thing, uses) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return + end + if pt.type ~= "node" then + return + end + + local under = minetest.env:get_node(pt.under) + local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local above = minetest.env:get_node(p) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + if not minetest.registered_nodes[above.name] then + return + end + + -- check if the node above the pointed thing is air + if above.name ~= "air" then + return + end + + -- check if pointing at dirt + if under.name ~= "default:dirt" and under.name ~= "default:dirt_with_grass" then + return + end + + -- if pointing at grass drop seeds + if under.name == "default:dirt_with_grass" then + for _,drop in ipairs(seeds) do + if math.random(1, drop.rarity) == 1 then + user:get_inventory():add_item("main", drop.name) + end + end + end + + -- turn the node into soil, wear out item and play sound + minetest.env:set_node(pt.under, {name="farming:soil"}) + minetest.sound_play("default_dig_crumbly", { + pos = pt.under, + gain = 0.5, + }) + itemstack:add_wear(65535/(uses-1)) + return itemstack +end + +minetest.register_tool("farming:hoe_wood", { + description = "Wooden Hoe", + inventory_image = "farming_tool_woodhoe.png", + + on_use = function(itemstack, user, pointed_thing) + return hoe_on_use(itemstack, user, pointed_thing, 30) + end, +}) + +minetest.register_tool("farming:hoe_stone", { + description = "Stone Hoe", + inventory_image = "farming_tool_stonehoe.png", + + on_use = function(itemstack, user, pointed_thing) + return hoe_on_use(itemstack, user, pointed_thing, 90) + end, +}) + +minetest.register_tool("farming:hoe_steel", { + description = "Steel Hoe", + inventory_image = "farming_tool_steelhoe.png", + + on_use = function(itemstack, user, pointed_thing) + return hoe_on_use(itemstack, user, pointed_thing, 200) + end, +}) + +minetest.register_craft({ + output = "farming:hoe_wood", + recipe = { + {"default:wood", "default:wood"}, + {"", "default:stick"}, + {"", "default:stick"}, + } +}) + +minetest.register_craft({ + output = "farming:hoe_stone", + recipe = { + {"default:cobble", "default:cobble"}, + {"", "default:stick"}, + {"", "default:stick"}, + } +}) + +minetest.register_craft({ + output = "farming:hoe_steel", + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"", "default:stick"}, + {"", "default:stick"}, + } +}) + +-- +-- Soil +-- + +minetest.register_node("farming:soil", { + description = "Soil", + tiles = {"farming_soil.png", "default_dirt.png"}, + drop = "default:dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=2}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("farming:soil_wet", { + description = "Wet Soil", + tiles = {"farming_soil_wet.png", "farming_soil_wet_side.png"}, + drop = "default:dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_abm({ + nodenames = {"group:soil"}, + interval = 15, + chance = 4, + action = function(pos, node) + -- check if there is water nearby + if minetest.env:find_node_near(pos, 4, {"group:water"}) then + -- if it is dry soil turn it into wet soil + if minetest.get_item_group(node.name, "soil") == 2 then + minetest.env:set_node(pos, {name="farming:soil_wet"}) + end + else + -- turn it back into dirt if it is already dry + if minetest.get_item_group(node.name, "soil") == 2 then + -- only turn it back if there is no plant on top of it + pos.y = pos.y+1 + local nn = minetest.env:get_node(pos).name + pos.y = pos.y-1 + if minetest.get_item_group(nn, "plant") == 0 then + minetest.env:set_node(pos, {name="default:dirt"}) + end + + -- if its wet turn it back into dry soil + elseif minetest.get_item_group(node.name, "soil") == 1 then + minetest.env:set_node(pos, {name="farming:soil"}) + end + end + end, +}) + +-- +-- Wheat +-- + +farming:register_plant("farming:wheat", { + plant_textures = { + "farming_wheat_1.png", + "farming_wheat_2.png", + "farming_wheat_3.png", + "farming_wheat_4.png", + "farming_wheat_5.png", + "farming_wheat_6.png", + "farming_wheat_7.png", + "farming_wheat_8.png" + }, + + item_description = "Wheat", + item_texture = "farming_wheat.png", + item_rarity = {1, 1, 4, 10}, + + plant_harvested = true, + plowing_rarity = 10, + + growing_intervals = 3, + growing_light = 10, +}) + +minetest.register_craftitem("farming:flour", { + description = "Flour", + inventory_image = "farming_flour.png", +}) + +minetest.register_craftitem("farming:bread", { + description = "Bread", + inventory_image = "farming_bread.png", + on_use = minetest.item_eat(6), +}) + +minetest.register_craft({ + type = "shapeless", + output = "farming:flour", + recipe = {"farming:wheat"} +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "farming:bread", + recipe = "farming:flour" +}) diff --git a/mods/farming/textures/farming_bread.png b/mods/farming/textures/farming_bread.png new file mode 100644 index 0000000000000000000000000000000000000000..e508cc7f1d9d6de091a4cd55f086a46777883d65 GIT binary patch literal 559 zcmV+~0?_@5P))6qo)~l$sNpn&$8HBLwIn}LDn9cJbo`0qo0SG;?{XE z)7O>#4mX#W2)DqbvUxxujuO|166gHf+|;}hhHq!4?FWiY_H=O!u{iy9!baZ120Se1 z-P{DMbrtv*E#2F`l|g%=^@*uGhXbeBod{PsU_Xh!-uG%$_VL0kH_uoZf3ISbWXf90 zd*BR*qL1S1jLjVhX&oF&Obx5}6i;8yNn@D4@%y{JRYJ)rx3``CE;YB*{QIrD`_luw zDsS^_cyG;M=oa$zGxzrmL0;lp(itWc$1Q76&-n7a|0PSPc*N2>2L%2DoyXwm>gTe~ HDWM4fwTWK_ literal 0 HcmV?d00001 diff --git a/mods/farming/textures/farming_soil.png b/mods/farming/textures/farming_soil.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ffeccee9a080d2c717e94fdf94ee50db3842d8 GIT binary patch literal 883 zcmV-(1C0EMP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00P@dL_t(I%Vm;XZ`))ThOfu3 z^EKzowW*tqBwM$Nwgf7KrgDHZtwMr7!5Kefzl)C%Tj4|X!Q!Euh8>H9y$QZ4$L}&#~2A31S zUBY^>E8hEp0&g-$16JdSzSA7Lv216JTxu|zN;|4hTs3Yv%r4W|MK1zWMc-eerb z%;rnV1x0t$<6g_dx&>~F8cqd&t%(ts%x)NlF}_#hkCO{V(VWR_iHJp#uDFipsKfoO zr=nLBltnvmajO+X=d{+Um~6%2S3UGH!BRq5DGom0ViHf;>8w*OD%6utyHEGG+hj?C zS!p^g7q4DHX~UC8JJd^x-JK5WRfi;5azAh}xxshJ1dS?|F^1oc2h0~4#xk4@Bl?#S z+CZM?ydOlo`1OR_oL`NpJ7qpxj#(LvJl<^^g-|Zr^!D!KR4W`E{mxCA;Wh4{jgV`@ ze34)@++-O7h=8&L`+B~_XpJ=!R&U;uXBsdJ$8#4W~j7c$7*7k|bjoPXF~4 zu*9NKEo1vm39=O?%{l1Zqdy2KyEQ)EXyP~pW)ZYD)_8c=r$4ynvz;yguiy4b(-isP z@t&~@MOGSiw_5mq9j)QV=fB{)bu0^%r5IktG-?IDKIk#J9^-pWp8xa;``g1uq|21^ z%aGT9p5tCcv;r3qVHCz7pb%e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00N&$L_t(I%Vp9_Z`(!`hT(UH zBazmfqAanh2;m4k33--tc(8*NkZQyG$px#8 zK`8{&dBPxQ;Rt~h4%2AC(LbMX9l`!6By87NTrPR__LN6^119G&7$_+a-?gMwLb6UZ zX$HGPpZM~c>s1QCgWVoiS8IeLIQuxqTF@5UvIJuh6|feNKxInMlpMj=oeHgL8Ik9N%`#?_@%(UvS*J)c zJO>UR_E{_v_J?h}5;%|h^%swJ2c&5V+As`T1dS~mYk2;3t zE*yM+k4klmSHJ$nDl@bjF2)LSV_B{?SOcr9n1K)=C0{b;x{#PAca%GU;zOj_2^5=D z6DQ!`@P5JQmKFb(IgK;`XOYHHlCZ7F^c^vZyN*{&&3sjGcDp`qIboCP|9({LiYdrl zP(j6oY=cSRaL;EviScUC?=`4ZN?ga#>$Ui{FBwlRc(^|V;N8)fG&6{21J9~b37x}( z(N_eWI@Z8XFMp@w*AWsN=`fupH0vdv{&2u7TF?oay!_=))Q``ekZw{YpJU$sJ;9G+ z!fhWR1hb0-1ULw4RhRptKCk~cA-9&3@r+^E;a{MqFQ>98=r8~P002ovPDHLkV1m|{ BXaN8K literal 0 HcmV?d00001 diff --git a/mods/farming/textures/farming_soil_wet_side.png b/mods/farming/textures/farming_soil_wet_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5b252d8845e35c2399f7ba2cf16609fc774e93 GIT binary patch literal 889 zcmV-<1BU#GP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00QAjL_t(I%QcT%Ph4dfg`fBP z_MSb=kpbpF1WM@$r4Xp5*m$Rji8uOZ{006pqu$sw(WXHIt+ka-12e0d1rMIES70P2+z z0M$x?;&P6ketSdU0}9^$y*g*_+HBO8X>M;4Sc`LxmuDALSIZ>Hm~=R%kjv5z6XrlM zYxw-|KB9^zBIL6^4|lg{U0l+=iBJV2!eBT>L_m~}eS6WxT1z?{(F+rdQ&3f&{eI3> z?*?7mX|LBSMDd7|&-SQS3dF++Njm0>#}AmyX9T`Sknyn9fFCy+tAtU?O*A5(4-kPk z8FRF^$#^tot+7gAEMc6mGWd?O95BCn1w3xsEk^K+>+1JCl4u>3jF-bAEc8hjg=w`72HCJ(-F?WU@}DnjDR(Q z`ReID-+g<6HG&|d@qnFs4RoP|(FiwF5SYwn?Cvx;-rZn2gIti|;L}ayn`T+-Yh}`8 zK(SPy-HUJw#W}}Sm>>e4g?x}ql*)P9*S9$5P*s)!pGW)m z`TENP3b_pJFv1IOVwSQ#3kNtjIod%Letmw_lz2+|Kx$D*bk9j0TTn}#2Ne=Rw zlFG>tQP^km?9?hp@yrL`T(&>&j?DkLr3_(uV2Uee~Ll3M%R`pLJf;FI1UGFVUl2VTwr_NS+jM@C9d5Si4F{2n$I?C_Rp1% zyI)i&df>$O+PAy(?#p{W`P*l5K5~uOqb!C4r-Q@g-`}_2&OSfcxS!qj?*-AEa=yP8 zUB0+aj#`myJU#Vf(pJIK>$k30b;{=qpM}}%%@%!(CpN8-EI5}lWtnELuE|WsNh&M1 zUd&A17jiT)r2cqnrTo_?4?oY{_tJc;uieG7C#(N537yK-Y3f-N4-5hZPgg&ebxsLQ E06HR)=l}o! literal 0 HcmV?d00001 diff --git a/mods/farming/textures/farming_tool_woodhoe.png b/mods/farming/textures/farming_tool_woodhoe.png new file mode 100644 index 0000000000000000000000000000000000000000..2a059f613c566f1391db88bcb22e765d64af241b GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DinK$vl=HlH+5kiEpy*OmPaH=D4KXuyzvrcy1pSa>?K-XjYsuEtt*^)rFoY*GG#h`G+ WUitT5wu3-dGkCiCxvX^PEo00008bVXQnLvL+uWo~o;_RN;Q0004d zNkl1wgZOKHO0&@r|$I!%Zv6Q00#D)f){0|yhq{UGhYHmAQ8;za2gI>th`#^^qq5fpYy)oIbc!c9Fjkjt)K9znwE`f zLJkCUi;`Kiat=A+u`%2_qJzr>_j0BEyg3j_(|p>)Jr$>ei@H(7A5Jl%f8d#`XqFL@ zSp_>gF5(__P%|n3_`@k~E=sh8y?=y8H6bTFHWE=Mwd)pvNSa}q*xRS314}?Mi`Kz~ zdn(Suvl7>hBD4%NXSnYxXg~7<)QuuOuMWWFonUb(L0i~+&cR&7f(nw)DBT-M5c)U(#hPh>QhQe_zt&%p`JcRqZ{T zr({nD<*NWQjTfz<*H;q0(0{*k>QU&^7CFU*;neN+nD9+)&sgg3-CcrWDOXKsGv6cYX*sQaow zv!&4giF+9@>x6e2h{&-yt>NMMR4ep>do)}-MqAu=stJMVOhO-l>JGklMlxJ-U+ z-yCJSN?Sy1(JE%?4+_sLABQ`(WG9;a|9$erhxf9F>{=ry{g*#tpB{43NrJ1q@fEil z+g{h8|4-GKL>YOnyqfsu|9@@f!~5s+@O(Ne5FNTO?e0vr5FXY7=7<(a3A?lZk1zPt z+~{Z+^yvTANzZ$P^d%+!?Mq7tn9RVoV)>E(@#hVj=XmauPTD0BpvZhdz;i+G|M`w0 xMVx=q6Kc;NQ1~XGag51ihOE-MfKCo}hR!sP&39TSYzF$5!PC{xWt~$(699Nhbff?P literal 0 HcmV?d00001 diff --git a/mods/farming/textures/farming_wheat_4.png b/mods/farming/textures/farming_wheat_4.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6f702b477813f680de59a2ef09a4f97c16b6ad GIT binary patch literal 410 zcmV;L0cHM)P)69U+3GiR+0!%! zxJy4ndILz#uJpvG8_v=9H#z06x_g|~OoBQvSxOr5;7kNe@1zG*2AJANv=4y48Hi{( zNhPjh(bX21J0_s(Hk*?S9^ho z5nX`A=IbRRHvw;-kdr_x(DwGiG_(97i?$NapVAx}sEn5)JAgIM$PYmK)EGNVHKxH0 zK#eldkkMVfp1&T53GPjLeT>eC`5F!PK+&R!PhIsppv6^?Vfq`Kle_`}-CW1b!cVUNZz;wvaCIA2c07*qoM6N<$ Ef&%NR2mk;8 literal 0 HcmV?d00001 diff --git a/mods/farming/textures/farming_wheat_5.png b/mods/farming/textures/farming_wheat_5.png new file mode 100644 index 0000000000000000000000000000000000000000..f762b5c1a86943fcec261cdf26dcbf5b0dbb2a2b GIT binary patch literal 471 zcmV;|0Vw{7P)bAwU;7^b+v$hF`7#kqe-BCkRCeyEO!B z&8(6-6s^*X*fs+_`pN(nFww(XoEd;a5E&TxWb-)?iWq&eQxF}8zFO6yoEt%ekk2fT zVBCCG(CP2bDiYx9+S7=WH27rn0sdsd#D1yd15Kwu?pct%qd;SxY5a1zk}B}shrs2H z$|a+>gbDchI?63mB&0+`jsQP)^;T^i1WA_Q5N{^nr2tu`B#bSb%HVIABq}gP*JF`2!nXxJLNA=>nyqWKN?|X0F z8{mK0+=?y#McXALgSCKyp#7Z4qQLRgBSb6 z>{}yPI3aQG@xcTYfA?8&AmS*XJPx+7YRl(Hbz9!a7`LA=nF^rg&n z(sgm`X5!LOxKu`vpKTe6!{`>;WMz@ z2ykgk$DvcV5%xGXsy^;q0aOuXr`8#G?CZ0Y`vhb*LwD20ks)BT#PRMGl_uM1dZ>I8 z=r$RamLo`Mw&!^Q<%yaR2>TvJ8xqQ|)q(AXi*r{s2Q~CwlRO=w)(?Q(+Lr*w3g($k zLhr5-xg|K-AyDVQddCR#S{xpIfsoejY?JTMG!Y@AVOHOpomwF!7l^c63aXgIbi?>A rtuGXQIl@0Ei?IzisbjLTDr0H6Nk6ki(GvE8(_cA~QR@R{_ zwkBv%b*LEucV5Z=ic|_jfy8`RCI1)y{H^=XPRk$n^Upp{y2>1AKgIQj<;<)3{Fi28 zv>s1pkq#wVD zFt42cKtVCc!BC-aG$-S%?nw*IJ^}X-aE{8e9f|v|J^g4A&Vf1*|5i9l{vJ88C-Nc- z@gff;O@U*x9>zo9@EThaJ1nfb62onv*;N3421^t(W8Zu#wKz$ux4G!FJ!qvc?ei4H z4B}8CiEUNb;Zs`vqR(+3KrbyQM~uh7f3h{C(~Dl5{oUZ5KQ+dUhkaarKPX{#p0 z4iM6Xv3}+RyCxLKFOXRm`0)$q1?3kRvBp63`w~9q97Ga|PTaaen=>0Ee0CT|WFyJm z4K}}cn9f}al}c>2x*y6Wl2Xi@QHh>We zzL7K7`pR3%PuDmOOnqk-gHpm|XCMR@wKe`Zp2-1I6xy_#M;o><$h&*4<-@)eHgA6b XI_TdywWD2e00000NkvXXu0mjfpX~!n literal 0 HcmV?d00001 diff --git a/mods/farming/textures/farming_wheat_8.png b/mods/farming/textures/farming_wheat_8.png new file mode 100644 index 0000000000000000000000000000000000000000..25079b23f9fe5f6c478732cf23e3e9962bc670a5 GIT binary patch literal 680 zcmV;Z0$2TsP)R{=Ql@#sJ2+-=v$UyV-`F*W65b$Jqu zpYNvsW&85RQvbgS2-jBjolEbv&)U8HGgX1q%sCJ15A?+}#gDU?mw|EFk)?t1U3m`U z(@Wh7`|x;HWfLAScZK8Y+jw~DmS<#aIva2ma3nTR!1$a{w$yCe!^1lW+37Pv4a=Sf z+O9zSY#UGSBFwMCa624bA4s4718xA-qNRdAugAm1o1T%SB<$!354i*|>;uV^1v>+z zuIVh6El_FET@N^Uog=&Cs*CJ}Hl9$DfMY#qMaHEa=iiTLj!Jt&$+Jbg6oc!=o4}HjGdU z4qzvNuui+Dwbd%xu{YwlO**G-_*AWwy9<=J^gokS7SOXT0TIe1H6)N!KwA-QvJHVf zf(Co~JW5Y5DC>XLstItSTQodx186o4xlJXnPlF-Vs`_h=9)5$MWBmov2=w{%)phOw O0000