• Mods are now organized as resources. Use the Mods link above to browse for or submit a mod, tool, or prefab.

    The TFP Official Modding Forum Policy establishes the rules and guidelines for mod creators and mod users.

Plant Code for Curing Concrete

TehAgent

Refugee
Sooooo Im trying to make a hybrid of the plant code to make it so you have to 'pour' the concrete. Your blocks will take time to form actual hardened blocks...because thats how concrete works. I seem to have gotten it to work...but I need to specify a model now. I want the player to craft forms, place the forms, and then fill them with concrete. Its part of an overhaul Mod Im doing for our Discord group...0 loot respawn, and generally smoothing out the early struggle with the long term game. There wont be block upgrades from wood all the way to steel. If you want solid concrete, you pour concrete.

Heres the error I got:

2026-01-11T20:46:26 34.258 ERR XML loader: Loading and parsing 'blocks.xml' failed
2026-01-11T20:46:26 34.262 EXC No model specified on block with name curedConcrete

And here are my two blocks:

<block name="concreteShapesStage1" shapes="All">
<!-- Class -->
<property name="CreativeMode" value="None"/>
<property name="Class" value="PlantGrowing"/>
<property name="PlantGrowing.Next" value="curedConcrete"/>
<property name="PlantGrowing.GrowthRate" value="186.0"/> <!-- For testing, this rate (in minutes) should be set no lower than 2 -->
<property name="PlantGrowing.FertileLevel" value="15"/>
<property name="PlantGrowing.IsRandom" value="false"/>
<property name="HarvestOverdamage" value="false"/>
<!-- UI_Info -->
<property name="CustomIcon" value="plantedBlueberry1"/>
<property name="DisplayInfo" value="Name"/>
<property name="DisplayType" value="blockMulti"/>
<property name="DescriptionKey" value="plantedCropsGroupDesc"/>
<!-- Visual -->
<property name="Material" value="Mplants"/>
<property name="Shape" value="New"/>
<property name="Texture" value="8"/>
<property name="MultiBlockDim" value="1,1,1"/>
<property name="ImposterDontBlock" value="true"/>
<property name="LightOpacity" value="0"/>
<property name="WaterFlow" value="permitted"/>
<!-- Placement -->
<property name="OnlySimpleRotations" value="true"/>
<property name="Collide" value="melee"/>
<property name="IsDecoration" value="true"/>
<property name="IsTerrainDecoration" value="false"/>
<property name="CanDecorateOnSlopes" value="false"/>
<!-- Value -->
<property name="VehicleHitScale" value="1"/>
<property name="EconomicValue" value="20"/>
<!-- Interaction -->
<drop event="Destroy" count="0"/>
<!-- Sorting -->
<property name="SortOrder1" value="M180"/>
<property name="SortOrder2" value="0000"/>
<property name="Group" value="Food/Cooking"/>
<property name="FilterTags" value="MC_outdoor,SC_crops"/>
</block>


<block name="curedConcrete">
<property name="CreativeMode" value="None"/>
<property name="PlantGrowing.FertileLevel" value="1"/>
<property name="HarvestOverdamage" value="false"/>
<property name="DisplayInfo" value="Description"/>
<property name="DisplayType" value="blockMulti"/>
<property name="Material" value="Mconcrete_shapes"/>
<property name="Shape" value="New"/>
<property name="Texture" value="8"/>
<property name="UiBackgroundTexture" value="8"/>
<property name="EconomicValue" value="50"/>
<property name="EconomicBundleSize" value="20"/>
<property class="RepairItems">
<property name="resourceConcreteMix" value="8"/>
</property>
<drop event="Harvest" name="resourceRockSmall" count="25" tag="allHarvest,perkJunkMiner"/>
<drop event="Destroy" count="0"/>
<drop event="Fall" name="terrDestroyedStone" count="1" prob="0.75" stick_chance="1"/>
<property class="UpgradeBlock">
<property name="ToBlock" value="steelShapes"/>
<property name="Item" value="resourceForgedSteel"/>
<property name="ItemCount" value="10"/>
<property name="UpgradeHitCount" value="4"/>
</property>
<property name="MultiBlockDim" value="1,2,1"/>
<property name="ImposterDontBlock" value="true"/>
<property name="LightOpacity" value="0"/>
<property name="WaterFlow" value="permitted"/>
<property name="Collide" value="melee"/>
<property name="IsTerrainDecoration" value="true"/>
<property name="IsDecoration" value="true"/>
<drop event="Destroy" count="0"/>
<drop event="Fall" name="resourceYuccaFibers" count="0" prob="1" stick_chance="0"/>
<property name="SortOrder1" value="M190"/>
<property name="SortOrder2" value="0000"/>
<property name="Tags" value="challenge_farming"/>
<property name="FilterTags" value="MC_outdoor,SC_crops"/>
</block>

These arent 'done' IE I dont want them to drop plant fibers; I just want to make them work first. It seems like after trial and error, I really just need a model to use.

Another option is to just make them have to be crafted in a mixer or workstation and take quite a bit of time. I really want to make the players actually plan ahead, craft forms, fill them with concrete and wait. Is there a grey block or wooden model I can use? And a final model thats concrete?

I can also make a block that is basically a workstation that takes X amount of time to process, and then the player has to go 'strip the forms off' and gets their wood back. Or most of it. It seems a bit micromamagey though; I just want them to have to think and plan ahead and actually upgrade the block with concrete mix, then walk away and not just live in a full strength concrete bunker in a days time.
 
Last edited:
I just remembered - I did something like this using a different method in A10.

Does the old 'upgrade rated' code still work?

I found my old stuff from way back then. This is an automated miner block I had made:


<block id="1423" name="miner">
<property name="Class" value="UpgradeRated" />
<property name="Material" value="metal" />
<property name="Texture" value="356" />
<property name="Weight" value="216" />
<property name="Collide" value="movement,rockets,sight,melee" />
<property class="UpgradeBlock">
<property name="ToBlock" value="activatedMiner" />
<property name="Item" value="chargedFuelCell" />
<property name="ItemCount" value="1" />
<property name="UpgradeHitCount" value="1" />
</property>
<drop event="Destroy" name="miner" count="1" />
<property name="HeatMapStrength" value="2"/>
<property name="HeatMapTime" value="1200"/>
<property name="HeatMapFrequency" value="25"/>
</block>

<block id="1517" name="activatedMiner">
<property name="Class" value="UpgradeRated" />
<property name="Material" value="metal" />
<property name="Texture" value="356" />
<property name="Weight" value="216" />
<property name="Collide" value="movement,rockets,sight,melee" />
<property name="UpgradeRated.ToBlock" value="processedMiner" />
<property name="UpgradeRated.Rate" value="5" />
<drop event="Destroy" count="0" />
<property name="HeatMapStrength" value="2"/>
<property name="HeatMapTime" value="1200"/>
<property name="HeatMapFrequency" value="25"/>
</block>
<block id="1424" name="processedMiner">
<property name="Class" value="Loot" />
<property name="Material" value="metal" />
<property name="Texture" value="356" />
<property name="Weight" value="216" />
<property name="Collide" value="movement,rockets,sight,melee" />
<property name="LootList" value="75" />
<drop event="Destroy" count="1" />
<property name="HeatMapStrength" value="3"/>
<property name="HeatMapTime" value="1200"/>
<property name="HeatMapFrequency" value="25"/>
<property name="DowngradeBlock" value="minerFusionCellCompartment" />
</block>

I guess I can just test this on my own, but was curious if anyone has done it recently. A10 was a LONG time ago.
 
Update:

UpgradeRated does not seem to work any more.

When I place an upgradeRated block, it just plops down as a shopping cart. If I remove the upgradeRated class, it goes down as a block. Sadface.

<block name="upgradeRatedTest1" shapes="All">
<property name="DescriptionKey" value="woodGroupDesc"/>
<property name="Material" value="Mwood_shapes"/>
<property name="Class" value="UpgradeRated" />
<property name="Texture" value="356" />
<property name="UpgradeRated.ToBlock" value="upgradeRatedTest2" />
<property name="UpgradeRated.Rate" value="1" />
<property name="Shape" value="New"/>
<property name="Texture" value="241"/>
<property name="UiBackgroundTexture" value="241"/>
<property name="FuelValue" value="500"/>
<property name="EconomicValue" value="10"/>
<property name="EconomicBundleSize" value="20"/>
<property class="RepairItems">
<property name="resourceWood" value="3"/>
</property>
<drop event="Harvest" name="resourceWood" count="2" tag="allHarvest,lumberjackHarvest,perkJunkMiner"/>
<drop event="Destroy" count="0"/>
<drop event="Fall" name="terrDestroyedWoodDebris" count="1" prob="0.75" stick_chance="1"/>
<property name="UpgradeSound" value="place_block_wood"/>
<property name="SoundPickup" value="woodblock_grab"/>
<property name="SoundPlace" value="woodblock_place"/>
<property name="SortOrder1" value="S000"/>
<!-- SortOrder2 is assigned in code to keep all of the shapes in the same order for each material -->
<property name="Group" value="Building,advBuilding"/>
<property name="Tags" value="wood"/>
<property name="FilterTags" value="MC_Shapes"/>
</block>

<block name="upgradeRatedTest2" shapes="All">
<property name="DescriptionKey" value="woodGroupDesc"/>
<property name="Material" value="Mwood_shapes"/>
<property name="Texture" value="7" />
<property name="Shape" value="New"/>
<property name="Texture" value="241"/>
<property name="UiBackgroundTexture" value="241"/>
<property name="FuelValue" value="500"/>
<property name="EconomicValue" value="10"/>
<property name="EconomicBundleSize" value="20"/>
<property class="RepairItems">
<property name="resourceWood" value="3"/>
</property>
<drop event="Harvest" name="resourceWood" count="2" tag="allHarvest,lumberjackHarvest,perkJunkMiner"/>
<drop event="Destroy" count="0"/>
<drop event="Fall" name="terrDestroyedWoodDebris" count="1" prob="0.75" stick_chance="1"/>
<property class="UpgradeBlock">
<property name="ToBlock" value="corrugatedMetalShapes"/>
<property name="Item" value="resourceScrapIron"/>
<property name="ItemCount" value="6"/>
<property name="UpgradeHitCount" value="4"/>
</property>
<property name="UpgradeSound" value="place_block_wood"/>
<property name="SoundPickup" value="woodblock_grab"/>
<property name="SoundPlace" value="woodblock_place"/>
<property name="SortOrder1" value="S000"/>
<!-- SortOrder2 is assigned in code to keep all of the shapes in the same order for each material -->
<property name="Group" value="Building,advBuilding"/>
<property name="Tags" value="wood"/>
<property name="FilterTags" value="MC_Shapes"/>
</block>
 
Update:

UpgradeRated does not seem to work any more.

When I place an upgradeRated block, it just plops down as a shopping cart. If I remove the upgradeRated class, it goes down as a block. Sadface.

<block name="upgradeRatedTest1" shapes="All">
<property name="DescriptionKey" value="woodGroupDesc"/>
<property name="Material" value="Mwood_shapes"/>
<property name="Class" value="UpgradeRated" />
<property name="Texture" value="356" />
<property name="UpgradeRated.ToBlock" value="upgradeRatedTest2" />
<property name="UpgradeRated.Rate" value="1" />
<property name="Shape" value="New"/>
<property name="Texture" value="241"/>
<property name="UiBackgroundTexture" value="241"/>
<property name="FuelValue" value="500"/>
<property name="EconomicValue" value="10"/>
<property name="EconomicBundleSize" value="20"/>
<property class="RepairItems">
<property name="resourceWood" value="3"/>
</property>
<drop event="Harvest" name="resourceWood" count="2" tag="allHarvest,lumberjackHarvest,perkJunkMiner"/>
<drop event="Destroy" count="0"/>
<drop event="Fall" name="terrDestroyedWoodDebris" count="1" prob="0.75" stick_chance="1"/>
<property name="UpgradeSound" value="place_block_wood"/>
<property name="SoundPickup" value="woodblock_grab"/>
<property name="SoundPlace" value="woodblock_place"/>
<property name="SortOrder1" value="S000"/>
<!-- SortOrder2 is assigned in code to keep all of the shapes in the same order for each material -->
<property name="Group" value="Building,advBuilding"/>
<property name="Tags" value="wood"/>
<property name="FilterTags" value="MC_Shapes"/>
</block>

<block name="upgradeRatedTest2" shapes="All">
<property name="DescriptionKey" value="woodGroupDesc"/>
<property name="Material" value="Mwood_shapes"/>
<property name="Texture" value="7" />
<property name="Shape" value="New"/>
<property name="Texture" value="241"/>
<property name="UiBackgroundTexture" value="241"/>
<property name="FuelValue" value="500"/>
<property name="EconomicValue" value="10"/>
<property name="EconomicBundleSize" value="20"/>
<property class="RepairItems">
<property name="resourceWood" value="3"/>
</property>
<drop event="Harvest" name="resourceWood" count="2" tag="allHarvest,lumberjackHarvest,perkJunkMiner"/>
<drop event="Destroy" count="0"/>
<drop event="Fall" name="terrDestroyedWoodDebris" count="1" prob="0.75" stick_chance="1"/>
<property class="UpgradeBlock">
<property name="ToBlock" value="corrugatedMetalShapes"/>
<property name="Item" value="resourceScrapIron"/>
<property name="ItemCount" value="6"/>
<property name="UpgradeHitCount" value="4"/>
</property>
<property name="UpgradeSound" value="place_block_wood"/>
<property name="SoundPickup" value="woodblock_grab"/>
<property name="SoundPlace" value="woodblock_place"/>
<property name="SortOrder1" value="S000"/>
<!-- SortOrder2 is assigned in code to keep all of the shapes in the same order for each material -->
<property name="Group" value="Building,advBuilding"/>
<property name="Tags" value="wood"/>
<property name="FilterTags" value="MC_Shapes"/>
</block>

Hi TehAgent

That's right, UpgradeRate was removed several alphas versions ago.
In my mod, I had to remove the fresh concrete versions for that reason.
I tried using the PlantGrowing code, but my base kept getting destroyed.
It was best to leave those blocks as obsolete.

Regards
Gouki
 
Hi TehAgent

That's right, UpgradeRate was removed several alphas versions ago.
In my mod, I had to remove the fresh concrete versions for that reason.
I tried using the PlantGrowing code, but my base kept getting destroyed.
It was best to leave those blocks as obsolete.

Regards
Gouki

I did get it to place the proper block and register as a curing concrete block using plantGrowing, but didnt stick around long enough to see if it actually 'grew' into the proper block. I will try that today and report back if it works properly.
 
I got it to work. I did of course have to add its own description key in the localization.txt file.

7 Days to Die Screenshot 2026.01.15 - 21.30.31.10.png

Here are the forms:

<block name="concreteForms" shapes="All">
<property name="DescriptionKey" value="woodGroupDesc"/>
<property name="Material" value="Mwood_shapes"/>
<property name="Shape" value="New"/>
<property name="Texture" value="241"/>
<property name="UiBackgroundTexture" value="241"/>
<property name="FuelValue" value="500"/>
<property name="EconomicValue" value="10"/>
<property name="EconomicBundleSize" value="20"/>
<property class="RepairItems">
<property name="resourceWood" value="3"/>
</property>
<drop event="Harvest" name="resourceWood" count="4" tag="allHarvest,lumberjackHarvest,perkJunkMiner"/>
<drop event="Destroy" count="0"/>
<drop event="Fall" name="terrDestroyedWoodDebris" count="1" prob="0.75" stick_chance="1"/>
<property class="UpgradeBlock">
<property name="ToBlock" value="concreteShapesStage1"/>
<property name="Item" value="resourceConcreteMix"/>
<property name="ItemCount" value="6"/>
<property name="UpgradeHitCount" value="4"/>
</property>
<property name="UpgradeSound" value="place_block_wood"/>
<property name="SoundPickup" value="woodblock_grab"/>
<property name="SoundPlace" value="woodblock_place"/>
<property name="SortOrder1" value="S000"/>
<property name="Group" value="Building,advBuilding"/>
<property name="Tags" value="wood"/>
<property name="FilterTags" value="MC_Shapes"/>
</block>


Heres the curing block:

<block name="concreteShapesStage1" shapes="All">
<property name="CreativeMode" value="None"/>
<property name="Class" value="PlantGrowing"/>
<property name="Model" value="@:Shapes/Cube.fbx"/>
<property name="PlantGrowing.Next" value="curedConcrete"/>
<property name="PlantGrowing.GrowthRate" value="186.0"/>
<property name="PlantGrowing.FertileLevel" value="15"/>
<property name="PlantGrowing.IsRandom" value="false"/>
<property name="HarvestOverdamage" value="false"/>

<property name="CustomIcon" value="plantedBlueberry1"/>
<property name="DisplayInfo" value="Description"/>
<!-- <property name="DisplayInfo" value="Name"/> -->
<property name="DisplayType" value="blockMulti"/>
<property name="DescriptionKey" value="concreteShapesStage1Desc"/>

<property name="Material" value="Mwood"/>
<property name="Shape" value="New"/>
<property name="Texture" value="8"/>
<property name="MultiBlockDim" value="1,1,1"/>
<property name="ImposterDontBlock" value="true"/>
<property name="LightOpacity" value="0"/>
<property name="WaterFlow" value="permitted"/>

<property name="OnlySimpleRotations" value="false"/>
<property name="Collide" value="melee"/>
<property name="IsDecoration" value="true"/>
<property name="IsTerrainDecoration" value="false"/>
<property name="CanDecorateOnSlopes" value="false"/>

<property name="VehicleHitScale" value="1"/>
<property name="EconomicValue" value="20"/>

<drop event="Destroy" count="0"/>

<property name="SortOrder1" value="M180"/>
<property name="SortOrder2" value="0000"/>
<property name="Group" value="Food/Cooking"/>
<property name="FilterTags" value="MC_Shapes"/> <!-- MC_outdoor,SC_crops -->
</block>

And here is the cured block:

<block name="curedConcrete">
<property name="CreativeMode" value="None"/>
<!-- <property name="DisplayInfo" value="Description"/> -->
<property name="DisplayType" value="blockMulti"/>
<property name="Model" value="@:Shapes/Cube.fbx"/>
<property name="DescriptionKey" value="concreteGroupDesc"/>
<property name="DisplayType" value="blockHardened"/>
<property name="Material" value="Mconcrete_shapes"/>
<property name="Shape" value="New"/>
<property name="Texture" value="8"/>
<property name="UiBackgroundTexture" value="8"/>
<property name="EconomicValue" value="50"/>
<property name="EconomicBundleSize" value="20"/>
<property class="RepairItems">
<property name="resourceConcreteMix" value="8"/>
</property>
<drop event="Harvest" name="resourceRockSmall" count="25" tag="allHarvest,perkJunkMiner"/>
<drop event="Destroy" count="0"/>
<drop event="Fall" name="terrDestroyedStone" count="1" prob="0.75" stick_chance="1"/>
<!-- <property class="UpgradeBlock">
<property name="ToBlock" value="steelShapes"/>
<property name="Item" value="resourceForgedSteel"/>
<property name="ItemCount" value="10"/>
<property name="UpgradeHitCount" value="4"/>
</property> -->
<property name="UpgradeSound" value="place_block_concrete"/>
<property name="SoundPickup" value="concreteblock_grab"/>
<property name="SoundPlace" value="concreteblock_place"/>
<property name="SortOrder1" value="S030"/>
<property name="Group" value="Building,advBuilding"/>
<property name="FilterTags" value="MC_Shapes"/>
</block>
 
There is still something wrong.

The recipe for the forms fails to load, though the block exists. It says there is no block with that name. Ive confirmed that the block does exist, theyre spelled the same, no typos etc. I had a similar issue earlier on where the block that was curing would throw an error that the steelShapes block didnt exist, but do it at a different stage of loading (during the post load material modifiers step)

I think it may need to also be a 'plantGrowing' block but havent figured it out yet. The curing part works and it does 'grow' into a fully cured 5000hp concrete block. The next thing Im doing as a test is to make the stage 1 block craftable instead. If that works, it indicates that something in the code doesnt like a 'normal block' being upgraded to a plant block...so I may have to make the form a plant block even though it should be upgraded TO a plant block.


EDIT: Nope. It still acts like the block doesnt exist. For a quick test Im going to make it an item and see what happens, since seeds are items.
 
Last edited:
Back
Top