Table of Contents

Class AuraSummon

Namespace
Nekoyume.Action
Assembly
Lib9c.dll
[Serializable]
[ActionType("aura_summon")]
public class AuraSummon : GameAction, IAction, IAuraSummonV1
Inheritance
AuraSummon
Implements
IAction
IAuraSummonV1
Inherited Members

Constructors

AuraSummon()

public AuraSummon()

AuraSummon(Address, int, int)

public AuraSummon(Address avatarAddress, int groupId, int summonCount)

Parameters

avatarAddress Address
groupId int
summonCount int

Fields

AvatarAddress

public Address AvatarAddress

Field Value

Address

AvatarAddressKey

public const string AvatarAddressKey = "aa"

Field Value

string

GroupId

public int GroupId

Field Value

int

GroupIdKey

public const string GroupIdKey = "gid"

Field Value

string

SummonCount

public int SummonCount

Field Value

int

SummonCountKey

public const string SummonCountKey = "sc"

Field Value

string

Properties

PlainValueInternal

protected override IImmutableDictionary<string, IValue> PlainValueInternal { get; }

Property Value

IImmutableDictionary<string, IValue>

Methods

AddAndUnlockOption(AgentState, Equipment, IRandom, Row, EquipmentItemOptionSheet, SkillSheet)

public static void AddAndUnlockOption(AgentState agentState, Equipment equipment, IRandom random, EquipmentItemSubRecipeSheetV2.Row subRecipe, EquipmentItemOptionSheet optionSheet, SkillSheet skillSheet)

Parameters

agentState AgentState
equipment Equipment
random IRandom
subRecipe EquipmentItemSubRecipeSheetV2.Row
optionSheet EquipmentItemOptionSheet
skillSheet 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 IActionContext

A 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

LoadPlainValueInternal(IImmutableDictionary<string, IValue>)

protected override void LoadPlainValueInternal(IImmutableDictionary<string, IValue> plainValue)

Parameters

plainValue IImmutableDictionary<string, IValue>

SimulateSummon(string, AgentState, EquipmentItemRecipeSheet, EquipmentItemSheet, EquipmentItemSubRecipeSheetV2, EquipmentItemOptionSheet, SkillSheet, Row, int, IRandom, long)

public static IEnumerable<(int, Equipment)> SimulateSummon(string addressesHex, AgentState agentState, EquipmentItemRecipeSheet recipeSheet, EquipmentItemSheet equipmentItemSheet, EquipmentItemSubRecipeSheetV2 equipmentItemSubRecipeSheetV2, EquipmentItemOptionSheet optionSheet, SkillSheet skillSheet, SummonSheet.Row summonRow, int summonCount, IRandom random, long blockIndex)

Parameters

addressesHex string
agentState AgentState
recipeSheet EquipmentItemRecipeSheet
equipmentItemSheet EquipmentItemSheet
equipmentItemSubRecipeSheetV2 EquipmentItemSubRecipeSheetV2
optionSheet EquipmentItemOptionSheet
skillSheet SkillSheet
summonRow SummonSheet.Row
summonCount int
random IRandom
blockIndex long

Returns

IEnumerable<(int, Equipment)>