fix: Fixes dupe property copying. Adds IgnoreDupe (#1811)
## Summary ### Changes - Adds `[IgnoreDupe]` and `[SerializedIgnoreDupe]` - Updates all _known_ classes that need the attribute. Some might be missing, please helps us find them! - Adds `Item.Dupe()` command and encapsulates `CopyProperties` and `OnAfterDuped`. This is also overridable. - Updates Dupe command to use the new logic. - Fixes duping multiple kinds of objects that used to be outright broken. ### Bug Fixes - Fixes issue with durability after duping - Fixes issue with hue after duping > [!Note] > **Developer Note** > Customizing how duping an item works now requires two steps: > 1. Add `[IgnoreDupe]` or `[SerializedIgnoreDupe]` to the property/field > 2. Add custom logic in an `OnAfterDuped` override > > When do you need to do this? > *When the property being copied is not a primitive, and you need to manually deep-clone the contents of the property such as with Lists, Dictionaries, or sub classes.*
This commit is contained in:
parent
a8d3d2773e
commit
9c7cb5d778
34 changed files with 502 additions and 248 deletions
|
|
@ -66,9 +66,9 @@ namespace Server.Engines.Plants
|
|||
private void Deserialize(IGenericReader reader, int version)
|
||||
{
|
||||
_fertileDirt = reader.ReadBool();
|
||||
NextGrowth = reader.ReadDateTime();
|
||||
_nextGrowth = reader.ReadDateTime();
|
||||
|
||||
GrowthIndicator = (PlantGrowthIndicator)reader.ReadInt();
|
||||
_growthIndicator = (PlantGrowthIndicator)reader.ReadInt();
|
||||
|
||||
_water = reader.ReadInt();
|
||||
|
||||
|
|
@ -139,16 +139,14 @@ namespace Server.Engines.Plants
|
|||
|
||||
public int MaxHits => 10 + (int)Plant.PlantStatus * 2;
|
||||
|
||||
public PlantHealth Health
|
||||
{
|
||||
get => (_hits * 100 / MaxHits) switch
|
||||
public PlantHealth Health =>
|
||||
(_hits * 100 / MaxHits) switch
|
||||
{
|
||||
< 33 => PlantHealth.Dying,
|
||||
< 66 => PlantHealth.Wilted,
|
||||
< 100 => PlantHealth.Healthy,
|
||||
_ => PlantHealth.Vibrant
|
||||
};
|
||||
}
|
||||
|
||||
[SerializableProperty(5)]
|
||||
public int Infestation
|
||||
|
|
@ -369,6 +367,41 @@ namespace Server.Engines.Plants
|
|||
LeftResources = 8;
|
||||
}
|
||||
|
||||
public void OnAfterDuped(Item newItem)
|
||||
{
|
||||
if (newItem is not PlantItem plant)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Copy all properties from this.PlantSystem to plantItem.PlantSystem
|
||||
var plantSystem = plant.PlantSystem;
|
||||
plantSystem.Water = Water;
|
||||
plantSystem.Hits = Hits;
|
||||
plantSystem.Infestation = Infestation;
|
||||
plantSystem.Fungus = Fungus;
|
||||
plantSystem.PoisonPotion = PoisonPotion;
|
||||
plantSystem.Disease = Disease;
|
||||
plantSystem.PoisonPotion = PoisonPotion;
|
||||
plantSystem.CurePotion = CurePotion;
|
||||
plantSystem.HealPotion = HealPotion;
|
||||
plantSystem.StrengthPotion = StrengthPotion;
|
||||
|
||||
plantSystem.Pollinated = Pollinated;
|
||||
|
||||
// Do not use getter since it has computed logic
|
||||
plantSystem.SeedType = _seedType;
|
||||
plantSystem.SeedHue = _seedHue;
|
||||
|
||||
plantSystem.AvailableSeeds = AvailableSeeds;
|
||||
plantSystem.LeftSeeds = LeftSeeds;
|
||||
plantSystem.AvailableResources = AvailableResources;
|
||||
plantSystem.LeftResources = LeftResources;
|
||||
plantSystem.FertileDirt = FertileDirt;
|
||||
plantSystem.NextGrowth = NextGrowth;
|
||||
plantSystem.GrowthIndicator = GrowthIndicator;
|
||||
}
|
||||
|
||||
public int GetLocalizedDirtStatus() =>
|
||||
Water switch
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue