Class CombinationEquipment
Hard forked at https://github.com/planetarium/lib9c/pull/2195
[Serializable]
[ActionType("combination_equipment17")]
public class CombinationEquipment : GameAction, IAction, ICombinationEquipmentV4
- Inheritance
-
CombinationEquipment
- Implements
-
IActionICombinationEquipmentV4
- Inherited Members
Fields
AvatarAddressKey
public const string AvatarAddressKey = "a"
Field Value
BasicSubRecipeHammerPoint
public const int BasicSubRecipeHammerPoint = 1
Field Value
PayByCrystalKey
public const string PayByCrystalKey = "p"
Field Value
PetIdKey
public const string PetIdKey = "pid"
Field Value
RecipeIdKey
public const string RecipeIdKey = "r"
Field Value
SlotIndexKey
public const string SlotIndexKey = "s"
Field Value
SpecialSubRecipeHammerPoint
public const int SpecialSubRecipeHammerPoint = 2
Field Value
SubRecipeIdKey
public const string SubRecipeIdKey = "i"
Field Value
UseHammerPointKey
public const string UseHammerPointKey = "h"
Field Value
avatarAddress
public Address avatarAddress
Field Value
- Address
payByCrystal
public bool payByCrystal
Field Value
petId
public int? petId
Field Value
- int?
recipeId
public int recipeId
Field Value
slotIndex
public int slotIndex
Field Value
subRecipeId
public int? subRecipeId
Field Value
- int?
useHammerPoint
public bool useHammerPoint
Field Value
Properties
PlainValueInternal
protected override IImmutableDictionary<string, IValue> PlainValueInternal { get; }
Property Value
- IImmutableDictionary<string, IValue>
Methods
AddAndUnlockOption(AgentState, PetState, Equipment, IRandom, Row, EquipmentItemOptionSheet, PetOptionSheet, SkillSheet)
public static void AddAndUnlockOption(AgentState agentState, PetState petState, Equipment equipment, IRandom random, EquipmentItemSubRecipeSheetV2.Row subRecipe, EquipmentItemOptionSheet optionSheet, PetOptionSheet petOptionSheet, SkillSheet skillSheet)
Parameters
agentState
AgentStatepetState
PetStateequipment
Equipmentrandom
IRandomsubRecipe
EquipmentItemSubRecipeSheetV2.RowoptionSheet
EquipmentItemOptionSheetpetOptionSheet
PetOptionSheetskillSheet
SkillSheet
AddSkillOption(AgentState, Equipment, IRandom, Row, EquipmentItemOptionSheet, SkillSheet)
public static void AddSkillOption(AgentState agentState, Equipment equipment, IRandom random, EquipmentItemSubRecipeSheetV2.Row subRecipe, EquipmentItemOptionSheet optionSheet, SkillSheet skillSheet)
Parameters
agentState
AgentStateequipment
Equipmentrandom
IRandomsubRecipe
EquipmentItemSubRecipeSheetV2.RowoptionSheet
EquipmentItemOptionSheetskillSheet
SkillSheet
Execute(IActionContext)
Executes the main game logic of an action. This should be deterministic.
Through the context
object,
it receives information such as a transaction signer,
its states immediately before the execution,
and a deterministic random seed.
Other “bound” information resides in the action object in itself, as its properties (or fields).
A returned Libplanet.Action.State.IWorld object functions as a delta which shifts from previous states to next states.
public override IWorld Execute(IActionContext context)
Parameters
context
IActionContextA context object containing addresses that signed the transaction, states immediately before the execution, and a PRNG object which produces deterministic random numbers. See Libplanet.Action.IActionContext for details.
Returns
- IWorld
A map of changed states (so-called "dirty").
Remarks
This method should be deterministic: for structurally (member-wise) equal actions and Libplanet.Action.IActionContexts, the same result should be returned. Side effects should be avoided, because an action's Libplanet.Action.IAction.Execute(Libplanet.Action.IActionContext) method can be called more than once, the time it's called is difficult to predict.
For changing in-memory game states or drawing graphics, implement the Blockchain.Renderers.IRenderer interface separately and attach it to a Blockchain.BlockChain instance.
For randomness, never use Random nor any other PRNGs provided by other than Libplanet. Use IActionContext.Random instead. IActionContext.Random guarantees the same action has the consistent result for every node in the network.
Also do not perform I/O operations such as file system access or networking. These bring an action indeterministic. You maybe fine to log messages for debugging purpose, but equivalent messages could be logged multiple times.
Although it might be surprising, floating-point arithmetics are underspecified so that it can make different results on different machines, platforms, runtimes, compilers, and builds.
Lastly, you need to be aware and keep in mind that there is a global state named CurrentCulture on .NET; if you format numbers, dates and times, currencies, or other such things into strings and parse these strings back these can rely on CurrentCulture, so that the same action make different results on two differently configured systems like Thai language and French language. In order to make these types of conversions deterministic, you have to explicitly pass InvariantCulture.
For more on determinism in general, please read also Tendermint ABCI's docs on determinism.
Lastly, you can conduct static analysis on your code using Libplanet.Analyzers. The analyzer can be enabled by adding its NuGet package into your project as a dependency.
- See Also
-
IActionContext
GetSkill(Row, SkillSheet, IRandom)
public static Skill GetSkill(EquipmentItemOptionSheet.Row row, SkillSheet skillSheet, IRandom random)
Parameters
row
EquipmentItemOptionSheet.RowskillSheet
SkillSheetrandom
IRandom
Returns
LoadPlainValueInternal(IImmutableDictionary<string, IValue>)
protected override void LoadPlainValueInternal(IImmutableDictionary<string, IValue> plainValue)
Parameters
plainValue
IImmutableDictionary<string, IValue>