public override StartStopResult Start(Creature creature, Skill skill, MabiDictionary dict)
{
creature.StopMove();
var chairItemEntityId = dict.GetLong("ITEMID");
if (chairItemEntityId != 0)
this.SetUpChair(creature, chairItemEntityId);
else
{
// Find all nearby sittable props and sit on closest one
var crpos = creature.GetPosition();
var props = creature.Region.GetProps(prop => prop.HasTag("/sittable/")
&& (!prop.HasXml || prop.Xml.Attribute("SITCHAR") == null || prop.Xml.Attribute("SITCHAR").Value == "0")
&& prop.GetPosition().GetDistance(crpos) < 125);
if (props.Count > 0)
{
int nearest = 0;
int minDist = 125;
for (int i = 0; i < props.Count; i++)
{
var dist = crpos.GetDistance(props[i].GetPosition());
if(dist < minDist)
{
nearest = i;
minDist = dist;
}
}
this.SitOnProp(creature, props[nearest]);
}
}
creature.Activate(CreatureStates.SitDown);
if (skill.Info.Rank >= SkillRank.R9)
creature.Activate(CreatureStatesEx.RestR9);
Send.SitDown(creature);
// Get base bonuses
var bonusLife = ((skill.RankData.Var1 - 100) / 100);
var bonusStamina = ((skill.RankData.Var2 - 100) / 100);
var bonusInjury = skill.RankData.Var3;
// Add bonus from campfire
// TODO: Check for disappearing of campfire? (OnDisappears+Recheck)
var campfires = creature.Region.GetProps(a => a.Info.Id == 203 && a.GetPosition().InRange(creature.GetPosition(), 500));
if (campfires.Count > 0)
{
// Add bonus if no chair?
if (chairItemEntityId == 0)
{
// TODO: Select nearest? Random?
var campfire = campfires[0];
var multi = (campfire.Temp.CampfireSkillRank != null ? campfire.Temp.CampfireSkillRank.Var1 / 100f : 1);
// Add bonus for better wood.
// Amounts unofficial.
if (campfire.Temp.CampfireFirewood != null)
{
if (campfire.Temp.CampfireFirewood.HasTag("/firewood01/"))
multi += 0.1f;
else if (campfire.Temp.CampfireFirewood.HasTag("/firewood02/"))
multi += 0.2f;
else if (campfire.Temp.CampfireFirewood.HasTag("/firewood03/"))
multi += 0.3f;
}
// Apply multiplicator
bonusLife *= multi;
bonusStamina *= multi;
bonusInjury *= multi;
}
Send.Notice(creature, Localization.Get("The fire feels very warm"));
}
creature.Regens.Add("Rest", Stat.Life, (0.12f * bonusLife), creature.LifeMax);
creature.Regens.Add("Rest", Stat.Stamina, (0.4f * bonusStamina), creature.StaminaMax);
creature.Regens.Add("Rest", Stat.LifeInjured, bonusInjury, creature.LifeMax); // TODO: Test if LifeInjured = Injuries
if (skill.Info.Rank == SkillRank.Novice) skill.Train(1); // Use Rest.
return StartStopResult.Okay;
}