Hi guys.
I struggling for something which looks like easy.
I have a ThinkTreeDef for my chickens name ChickenHerd (see code below). It is inspired from HerbivoreHerd (used for muffalo in Core). I added 2 new jobs : Breeding and Egging. (dunno if the word "egging" exists, but you get the idea).
And here is my ThingDef for my chicken.
The problem is that these chicken dont move nor do nothing at all, in fact. In the inspector they have no <curJob>. Well they have one but set to null.
Ok i found that's coming from my C# class below :
The cast var chicken = pawn as Chicken returns null, because it's not doable. So ok.
A sample of my output_log
There is my Chicken.cs
This is where i'm lost for now. How could it not be cast. The class should be found
Thank you all
I struggling for something which looks like easy.
I have a ThinkTreeDef for my chickens name ChickenHerd (see code below). It is inspired from HerbivoreHerd (used for muffalo in Core). I added 2 new jobs : Breeding and Egging. (dunno if the word "egging" exists, but you get the idea).
Code Select
<?xml version="1.0" encoding="utf-8" ?>
<ThinkTrees>
<ThinkTreeDef>
<defName>ChickenHerd</defName>
<thinkRoot Class="AI.ThinkNode_Priority">
<subNodes>
<li Class="AI.ThinkNode_Subtree">
<treeDef>BurningResponse</treeDef>
</li>
<li Class="AI.ThinkNode_Subtree">
<treeDef>Psychotic</treeDef>
</li>
<li Class="AI.ThinkNode_Subtree">
<treeDef>SelfDefense</treeDef>
</li>
<!-- <li Class="AI.JobGiver_Birth, ChickenBreeding"/> -->
<li Class="AI.JobGiver_Egging, ChickenBreeding"/>
<li Class="AI.ThinkNode_SatisfyNeeds"/>
<li Class="AI.JobGiver_Breeding, ChickenBreeding"/>
<li Class="AI.JobGiver_WanderHerd"/>
<li Class="AI.JobGiver_IdleError"/>
</subNodes>
</thinkRoot>
</ThinkTreeDef>
</ThinkTrees>
And here is my ThingDef for my chicken.
Code Select
<?xml version="1.0" encoding="utf-8" ?>
<ThingDefs>
<ThingDef Name="BasePawn" Abstract="True">
<eType>Pawn</eType>
<thingClass>Pawn</thingClass>
<category>Pawn</category>
<selectable>true</selectable>
<tickerType>Normal</tickerType>
<altitudeLayer>Pawn</altitudeLayer>
<useStandardHealth>false</useStandardHealth>
<flammability>1.0</flammability>
<hasTooltip>true</hasTooltip>
<bulletImpactSound>BulletImpactFlesh</bulletImpactSound>
<inspectorTabs>
<li>UI.ITab_Pawn_Thoughts</li>
<li>UI.ITab_Pawn_Needs</li>
<li>UI.ITab_Pawn_Prisoner</li>
<li>UI.ITab_Pawn_Character</li>
</inspectorTabs>
<drawGUIOverlay>true</drawGUIOverlay>
</ThingDef>
<!-- ============================ Animals ========================== -->
<ThingDef ParentName="BasePawn" Name="BaseAnimal" Abstract="True">
<race>
<hasStory>false</hasStory>
<needsRest>false</needsRest>
<minFoodQuality>Plant</minFoodQuality>
<isFlesh>true</isFlesh>
<hasGenders>true</hasGenders>
</race>
</ThingDef>
<ThingDef ParentName="BaseAnimal">
<defName>Chicken</defName>
<label>Chicken</label>
<maxHealth>35</maxHealth>
<overdraw>false</overdraw>
<targetHitChanceFactor>0.8</targetHitChanceFactor>
<race>
<thinkTree>ChickenHerd</thinkTree>
<walkSpeed>0.8</walkSpeed>
<meleeDamage>6</meleeDamage>
<hungerThreshold>80</hungerThreshold>
<bodySize>0.3</bodySize>
</race>
</ThingDef>
</ThingDefs>
The problem is that these chicken dont move nor do nothing at all, in fact. In the inspector they have no <curJob>. Well they have one but set to null.
Ok i found that's coming from my C# class below :
Code Select
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace AI
{
public class JobGiver_Egging : ThinkNode_JobGiver
{
protected override Job TryGiveTerminalJob(Pawn pawn)
{
var chicken = pawn as Chicken;
Debug.LogError(pawn.ToString());
if (chicken == null)
return null;
if (chicken.Pregnancy == null || !chicken.Pregnancy.IsDue)
return null;
return new Job(DefDatabase<JobDef>.GetNamed("Egging"));
}
}
}
The cast var chicken = pawn as Chicken returns null, because it's not doable. So ok.
A sample of my output_log
Code Select
Chicken_Chicken21963
(Filename: C:/BuildAgent/work/d3d49558e4d408f4/artifacts/StandalonePlayerGenerated/UnityEngineDebug.cpp Line: 53)
Chicken_Chicken21964
(Filename: C:/BuildAgent/work/d3d49558e4d408f4/artifacts/StandalonePlayerGenerated/UnityEngineDebug.cpp Line: 53)
There is my Chicken.cs
Code Select
using System;
using System.Linq;
using AI;
public class Chicken : Pawn
{
//private readonly Breeder breeder;
public Pregnancy Pregnancy;
public AgeTicker AgeTicker;
public Chicken()
{
AgeTicker = new AgeTicker(this);
}
public Pawn Mother { get; set; }
public override void Tick()
{
base.Tick();
if (Pregnancy != null)
Pregnancy.Tick();
if (AgeTicker != null)
AgeTicker.Tick();
}
public override string GetInspectString()
{
return base.GetInspectString()
+ (IsPregnant() ? "Pregnant\r\n" + (Pregnancy.OverDue ? "Over due\r\n" : "") : "");
}
public void SetPregnant()
{
Pregnancy = new Pregnancy(this);
}
public bool IsPregnant()
{
return Pregnancy != null;
}
}
This is where i'm lost for now. How could it not be cast. The class should be found
Thank you all