overlord_event_system/
event.rs

1use chrono::Utc;
2use configs::cheats::CheatScriptId;
3use essences::ability_presets::AbilityPresetId;
4use essences::ad_usage::AdPlacement;
5use essences::autochest::{AutoChestFilter, AutoChestFilterId};
6use essences::currency::{CurrencyConsumer, CurrencySource, CurrencyUnit};
7use essences::dungeons::DungeonTemplateId;
8use essences::entity::{Coordinates, EntityAttributes, EntityId};
9use essences::fighting::{EntityTeam, FightTemplateId};
10use essences::game::EntityTemplateId;
11use essences::gift::Gift;
12use essences::items::{Item, ItemTemplateId, ItemType};
13use essences::offers::{Offer, OfferId, OfferTemplateId};
14use essences::pets::{EquippedPets, PetCaseRollType, PetDrop, PetId, PetSlotId, UpgradedPetsMap};
15use essences::prelude::*;
16use essences::pvp::PVPState;
17use essences::quest::QuestGroupType;
18use essences::skins::SkinId;
19use essences::talent_tree::TalentId;
20use essences::vassals::Suzerain;
21use essences::vassals::VassalTask;
22use essences::{
23    abilities::{
24        AbilityCaseRollType, AbilityDrop, AbilityId, AbilitySlotId, EquippedAbilities,
25        UpgradedAbilitiesMap,
26    },
27    bundles::BundleId,
28};
29use event_system::derive::Event;
30use event_system::derive::RhaiEnum;
31pub use event_system::event::Event;
32use event_system::event::{EventRhaiEnum, EventStruct, EventVec};
33use event_system::script::scope::ScriptScope;
34use schemars::JsonSchema;
35
36use crate::script::CustomEventData;
37
38#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
39#[tsify(from_wasm_abi, into_wasm_abi)]
40pub enum AdRewardType {
41    AfkInstant,
42    AfkBoost,
43    DailyBooster,
44    UpgradeSpeedup,
45    FreeAbilityCaseOpen,
46    FreePetCaseOpen,
47    DungeonRaid {
48        dungeon_id: DungeonTemplateId,
49        difficulty: i64,
50    },
51    ArenaRefresh,
52    ClaimBirdReward {
53        variant_id: configs::ads_settings::BirdVariantId,
54    },
55}
56
57#[derive(
58    PartialEq,
59    Eq,
60    Clone,
61    Debug,
62    Event,
63    RhaiEnum,
64    JsonSchema,
65    Tsify,
66    Serialize,
67    Deserialize,
68    strum_macros::Display,
69    strum_macros::VariantNames,
70)]
71#[tsify(into_wasm_abi, from_wasm_abi, namespace)]
72pub enum OverlordEvent {
73    // Item Case
74    #[event_type(client)]
75    OpenItemCase {
76        batch_size: i64,
77    },
78    AutoChestOpenItemCase {
79        batch_size: i64,
80    },
81    PlayerNewItems {
82        items: Vec<Item>,
83    },
84    #[event_type(client)]
85    PlayerEquipItem {
86        item_id: Uuid,
87    },
88    #[event_type(client)]
89    SellItem {
90        item_id: Uuid,
91    },
92    ItemSold {
93        item_id: Uuid,
94    },
95    #[event_type(client, sync)]
96    UpgradeItemCase {},
97    ItemCaseUpgraded {},
98    #[event_type(client, sync)]
99    SpeedupUpgradeItemCase {},
100    #[event_type(client, sync)]
101    SkipUpgradeItemCase {},
102    #[event_type(client, sync)]
103    ClaimUpgradeItemCase {},
104
105    #[event_type(client)]
106    EnableAutoSell {},
107
108    #[event_type(client)]
109    DisableAutoSell {},
110
111    #[event_type(client)]
112    SetGearOverrideEnabled {
113        item_type: ItemType,
114        enabled: bool,
115    },
116
117    // Auto-chest
118    #[event_type(client)]
119    EnableAutoChest {},
120
121    #[event_type(client)]
122    DisableAutoChest {},
123
124    #[event_type(client)]
125    EnableAutoChestFilter {
126        filter_id: AutoChestFilterId,
127    },
128
129    #[event_type(client)]
130    DisableAutoChestFilter {},
131
132    #[event_type(client)]
133    EnableAutoChestPowerCompare {},
134
135    #[event_type(client)]
136    DisableAutoChestPowerCompare {},
137
138    #[event_type(client)]
139    UpdateAutoChestBatchSize {
140        batch_size: i64,
141    },
142
143    #[event_type(client)]
144    NewAutoChestFilter {
145        filter: AutoChestFilter,
146    },
147
148    #[event_type(client)]
149    UpdateAutoChestFilter {
150        updated_filter: AutoChestFilter,
151    },
152
153    #[event_type(client)]
154    RemoveAutoChestFilter {
155        filter_id: AutoChestFilterId,
156    },
157
158    // Ability Case
159    #[event_type(client, sync)]
160    OpenAbilityCase {
161        roll_type: AbilityCaseRollType,
162    },
163
164    /// Обновляет вишлист гачи способностей.
165    /// Список ограничен числом слотов и разрешенными редкостями текущего уровня гачи.
166    #[event_type(client, sync)]
167    SetAbilityGachaWishlist {
168        ability_ids: Vec<AbilityId>,
169    },
170
171    /// Повышает уровень указанного слота способностей за Stardust.
172    #[event_type(client, sync)]
173    UpgradeAbilitySlot {
174        slot_id: u64,
175    },
176
177    AbilityCaseOpened {
178        batch_size: u8,
179    },
180
181    // For frontend display and quest progression
182    NewAbilities {
183        abilities: Vec<AbilityDrop>,
184    },
185
186    #[event_type(client, sync)]
187    FastEquipAbilities {},
188
189    #[event_type(client)]
190    EquipAbility {
191        slot_id: u64,
192        ability_id: AbilityId,
193    },
194
195    #[event_type(client)]
196    UnequipAbility {
197        slot_id: AbilitySlotId,
198    },
199
200    EquipAbilities {
201        equipped_abilities: EquippedAbilities,
202    },
203
204    #[event_type(client, sync)]
205    UpgradeAbility {
206        ability_id: AbilityId,
207    },
208
209    #[event_type(client, sync)]
210    UpgradeAllAbilities {},
211
212    // For frontend display and quests progression
213    UpgradedAbilities {
214        upgraded_abilities: UpgradedAbilitiesMap,
215    },
216
217    UpgradeAbilityCase {},
218
219    CurrencyIncrease {
220        currencies: Vec<CurrencyUnit>,
221        currency_source: CurrencySource,
222    },
223
224    CurrencyDecrease {
225        currencies: Vec<CurrencyUnit>,
226        currency_consumer: CurrencyConsumer,
227    },
228
229    // Level
230    NewCharacterLevel {
231        level: i64,
232    },
233
234    // Fight management
235    #[event_type(client, sync)]
236    StartGame {},
237    #[event_type(client)]
238    PrepareFight {
239        prepare_fight_type: PrepareFightType,
240    },
241    #[event_type(client)]
242    StartFight {
243        fight_id: Uuid,
244    },
245    #[event_type(client)]
246    FightProgress {},
247    EndFight {
248        fight_id: Uuid,
249        is_win: bool,
250        pvp_state: Option<PVPState>,
251    },
252    StageCleared {},
253
254    #[event_type(client, sync)]
255    RaidDungeon {
256        dungeon_id: DungeonTemplateId,
257        difficulty: i64,
258        amount: i64,
259    },
260
261    WaveCleared {},
262
263    // PVP
264    #[event_type(client, sync)]
265    StartVassalPVPSync {
266        opponent_id: Uuid,
267        opponent_suzerain_id: Option<Uuid>,
268    },
269
270    #[event_type(client, sync)]
271    StartArenaPVPSync {
272        opponent_id: Uuid,
273        is_bot: bool,
274    },
275
276    #[event_type(client, sync)]
277    StartArenaRematchSync {
278        match_id: Uuid,
279    },
280
281    #[event_type(client, sync)]
282    RefreshArenaMatchmaking {},
283
284    #[event_type(client, sync)]
285    BuyArenaTicket {},
286
287    // Moving
288    StartMove {
289        entity_id: Uuid,
290        to: Coordinates,
291        duration_ticks: u64,
292    },
293    // Event is delayed, so it must be non_deterministic
294    EndMove {
295        entity_id: Uuid,
296    },
297
298    // Fighting
299    SpawnEntity {
300        id: EntityId,
301        entity_template_id: EntityTemplateId,
302        position: Coordinates,
303        entity_team: EntityTeam,
304        has_big_hp_bar: bool,
305        entity_attributes: EntityAttributes,
306    },
307
308    StartCastAbility {
309        by_entity_id: Uuid,
310        ability_id: AbilityId,
311        pet_id: Option<PetId>,
312    },
313    // Event is delayed, so it must be non_deterministic
314    StartedCastAbility {
315        by_entity_id: Uuid,
316        ability_id: AbilityId,
317        duration_ticks: u64,
318    },
319    CastAbility {
320        by_entity_id: Uuid,
321        to_entity_id: Uuid,
322        ability_id: AbilityId,
323    },
324    StartCastProjectile {
325        by_entity_id: Uuid,
326        to_entity_id: Uuid,
327        projectile_id: Uuid,
328        level: i64,
329        delay: u64,
330    },
331    StartedCastProjectile {
332        by_entity_id: Uuid,
333        to_entity_id: Uuid,
334        projectile_id: Uuid,
335        duration_ticks: u64,
336    },
337    // TODO move all projectiles into state, and make fight_progress manage them, so we dont need deterministic
338    // Event is delayed, so it must be non_deterministic
339    CastProjectile {
340        by_entity_id: Uuid,
341        to_entity_id: Uuid,
342        projectile_id: Uuid,
343        level: i64,
344        projectile_data: CustomEventData,
345    },
346    Damage {
347        entity_id: Uuid,
348        damage: u64,
349        damage_data: CustomEventData,
350    },
351    Heal {
352        entity_id: Uuid,
353        heal: u64,
354    },
355    CounterAttack {
356        by_entity_id: Uuid,
357        to_entity_id: Uuid,
358        duration_ticks: u64,
359    },
360    Multicast {
361        entity_id: Uuid,
362        amount: u64,
363    },
364    Evasion {
365        entity_id: Uuid,
366    },
367    PlayerDeath {},
368    EntityDeath {
369        entity_id: Uuid,
370        reward: Vec<CurrencyUnit>,
371    },
372    EntityIncrAttribute {
373        entity_id: Uuid,
374        attribute: String,
375        delta: i64,
376    },
377    EntityApplyEffect {
378        entity_id: Uuid,
379        effect_id: Uuid,
380    },
381    CastEffect {
382        entity_id: Uuid,
383        effect_id: Uuid,
384    },
385    CastEffectFromEvent {
386        entity_id: Uuid,
387        effect_id: Uuid,
388        caller_event: Box<OverlordEvent>,
389    },
390    FightCustomEvent {
391        entity_id: u64,
392        value: String,
393    },
394    FightVisualEvent {
395        effect_type: String,
396        effect_data: CustomEventData,
397    },
398
399    SetMaxHp {
400        entity_id: EntityId,
401        new_max_hp: u64,
402        new_hp: u64,
403    },
404
405    // Vassal Links
406    #[event_type(client, sync)]
407    ClaimVassalReward {
408        character_id: Uuid,
409    },
410
411    #[event_type(client, sync)]
412    ClaimSuzerainReward {},
413
414    NewSuzerain {
415        new_suzerain: Option<Suzerain>,
416    },
417
418    RemoveVassal {
419        vassal_id: Uuid,
420    },
421
422    // Vassal Tasks
423    #[event_type(client, sync)]
424    GiveTask {
425        vassal_id: Uuid,
426        template_task_id: Uuid,
427    },
428
429    NewTask {
430        new_task: VassalTask,
431    },
432
433    #[event_type(client)]
434    AcceptTask {
435        task_id: Uuid,
436        is_good: bool,
437    },
438
439    TaskAccepted {
440        task_id: Uuid,
441        started_good: bool,
442        started_at: chrono::DateTime<Utc>,
443        finish_at: chrono::DateTime<Utc>,
444    },
445
446    #[event_type(client)]
447    HitHands {
448        task_id: Uuid,
449    },
450
451    HandsHitted {
452        task_id: Uuid,
453    },
454
455    TaskFinished {
456        task_id: Uuid,
457    },
458
459    #[event_type(client)]
460    ClaimTaskReward {
461        task_id: Uuid,
462    },
463
464    // Resist Task
465    GiveResistTask {
466        new_resist_task: VassalTask,
467    },
468
469    #[event_type(client, sync)]
470    AcceptResistTask {},
471
472    ResistTaskAccepted {
473        new_resist_task: VassalTask,
474    },
475
476    #[event_type(client)]
477    CatchResistTask {
478        task_id: Uuid,
479    },
480
481    ResistTaskCatched {
482        task_id: Uuid,
483    },
484
485    ResistTaskFinished {
486        task_id: Uuid,
487    },
488
489    #[event_type(client)]
490    ClaimResistTaskReward {
491        task_id: Uuid,
492    },
493
494    // Custom value
495    SetCustomValue {
496        key: String,
497        value: i64,
498    },
499
500    // Connection store
501    SetConnectionStore {
502        key: String,
503        value: i64,
504    },
505
506    // Quest
507    #[event_type(client)]
508    ClaimQuest {
509        quest_id: Uuid,
510    },
511
512    #[event_type(client, sync)]
513    ClaimAllQuests {
514        quest_group_type: QuestGroupType,
515    },
516
517    PatronQuestCompleted {
518        quest_id: Uuid,
519    },
520
521    HiddenQuestCompleted {
522        quest_id: Uuid,
523    },
524
525    QuestCompleted {
526        quest_id: Uuid,
527    },
528
529    NewQuests {
530        quest_ids: Vec<Uuid>,
531    },
532
533    // Triggered when loop task flow breaks
534    UpdateActiveLoopTaskId {
535        quest_id: Uuid,
536    },
537
538    ResetRepeatingQuests {
539        quest_ids: Vec<Uuid>,
540    },
541
542    #[event_type(client)]
543    ClaimQuestProgressionReward {
544        quest_group_type: QuestGroupType,
545    },
546
547    // Referrals
548    #[event_type(client)]
549    ClaimReferralLvlUpReward {
550        level: i64,
551    },
552
553    #[event_type(client)]
554    ClaimReferralDailyReward {},
555
556    ReferralDailyRewardStatusUpdate {
557        referral_daily_reward_status: bool,
558    },
559
560    // Gifts
561    #[event_type(client)]
562    SendGift {
563        receiver_id: Uuid,
564        config_gift_id: Uuid,
565    },
566
567    NewGift {
568        new_gift: Gift,
569    },
570
571    #[event_type(client)]
572    AcceptGift {
573        gift_id: Uuid,
574    },
575
576    // AfkReward
577    #[event_type(client, sync)]
578    ClaimAfkReward {},
579
580    AfkRewardClaimed {},
581
582    /// Emitted when the player crosses the AFK rewards unlock chapter threshold
583    /// and the async handler has adjusted `last_afk_reward_claimed_at` so that
584    /// the elapsed time is not less than `min_required_time_sec`.
585    /// The side effect handler persists the new value to the database.
586    AfkRewardsGatingUnlocked {},
587
588    #[event_type(client, sync)]
589    ClaimAfkInstantRewardGems {},
590
591    // Ad Rewards
592    #[event_type(client, sync)]
593    WatchAd {
594        ad_reward_type: AdRewardType,
595    },
596
597    ShowBird {
598        variant_id: configs::ads_settings::BirdVariantId,
599    },
600
601    /// Отправляется клиентом, когда птица была успешно показана игроку.
602    /// Переводит птицу в полный кулдаун.
603    #[event_type(client)]
604    BirdShown {},
605
606    ResetAdUsage {
607        placements: Vec<AdPlacement>,
608    },
609
610    ResetInstantRewardGemsPressCount {},
611
612    // Bundles
613    #[event_type(client, sync)]
614    ClaimBundleStepGeneric {},
615
616    AddBundleGroup {
617        bundle_ids: Vec<BundleId>,
618    },
619
620    // Classes
621    #[event_type(client, sync)]
622    ChangeClass {
623        new_class_id: uuid::Uuid,
624    },
625
626    // User Account
627    #[event_type(client, sync)]
628    LinkGuestAccount {
629        token: String,
630    },
631
632    #[event_type(client, sync)]
633    SetUsername {
634        username: String,
635    },
636
637    #[event_type(client, sync)]
638    SetCharacterBlocked {
639        character_id: Uuid,
640        blocked: bool,
641    },
642
643    // Ability Presets
644    #[event_type(client, sync)]
645    CreateAbilityPreset {
646        name: Option<String>,
647        ability_ids: Vec<AbilityId>,
648        index: i64,
649    },
650
651    #[event_type(client, sync)]
652    EditAbilityPreset {
653        preset_id: AbilityPresetId,
654        name: String,
655        ability_ids: Vec<AbilityId>,
656    },
657
658    EnableCaseUpgradePopUp {},
659
660    #[event_type(client)]
661    DisableCaseUpgradePopUp {},
662
663    // Skins
664    #[event_type(client, sync)]
665    BuySkins {
666        skin_ids: Vec<SkinId>,
667        equip: bool,
668    },
669
670    #[event_type(client, sync)]
671    EquipAndUnequipSkins {
672        equip_skin_ids: Vec<SkinId>,
673        unequip_skin_ids: Vec<SkinId>,
674    },
675
676    // Cheat
677    #[event_type(client)]
678    RunCheat {
679        cheat: Cheat,
680    },
681
682    // Mail
683    #[event_type(client, sync)]
684    ClaimMail {
685        mail_id: essences::mail::MailId,
686    },
687
688    #[event_type(client, sync)]
689    ClaimAllMails {},
690
691    #[event_type(client, sync)]
692    MakeRead {
693        mail_id: essences::mail::MailId,
694    },
695
696    #[event_type(client, sync)]
697    MakeAllRead {},
698
699    #[event_type(client, sync)]
700    DeleteMail {
701        mail_id: essences::mail::MailId,
702    },
703
704    #[event_type(client, sync)]
705    DeleteAllMails {},
706
707    NewMail {
708        new_mail: essences::mail::Mail,
709    },
710
711    // Offers
712    #[event_type(client, sync)]
713    NewOffer {
714        offer_template_id: OfferTemplateId,
715    },
716
717    #[event_type(client, sync)]
718    BuyOffer {
719        purchase_token: Option<String>,
720        offer_id: OfferId,
721    },
722
723    OfferPurchaseCompleted {
724        purchase_token: String,
725        offer_id: OfferId,
726    },
727
728    OfferPurchaseFailed {
729        purchase_token: String,
730        offer_id: OfferId,
731    },
732
733    PurchasesBanned {},
734
735    ResetOffers {
736        new_offers: Vec<Offer>,
737    },
738
739    // Pets
740    #[event_type(client)]
741    EquipPet {
742        slot_id: u64,
743        pet_id: PetId,
744    },
745
746    #[event_type(client)]
747    UnequipPet {
748        slot_id: PetSlotId,
749    },
750
751    #[event_type(client, sync)]
752    FastEquipPets {},
753
754    EquipPets {
755        equipped_pets: EquippedPets,
756    },
757
758    #[event_type(client, sync)]
759    UpgradePet {
760        pet_id: PetId,
761    },
762
763    #[event_type(client, sync)]
764    UpgradeAllPets {},
765
766    // For frontend display and quests progression
767    UpgradedPets {
768        upgraded_pets: UpgradedPetsMap,
769    },
770
771    #[event_type(client)]
772    UpgradePetSlot {
773        slot_id: u64,
774    },
775
776    // Pet Case (Gacha)
777    #[event_type(client, sync)]
778    OpenPetCase {
779        roll_type: PetCaseRollType,
780    },
781
782    /// Обновляет вишлист гачи петов.
783    #[event_type(client, sync)]
784    SetPetGachaWishlist {
785        pet_ids: Vec<PetId>,
786    },
787
788    PetCaseOpened {
789        batch_size: u8,
790    },
791
792    // For frontend display and quest progression
793    NewPets {
794        pets: Vec<PetDrop>,
795    },
796
797    UpgradePetCase {},
798
799    // Tutorial
800    #[event_type(client)]
801    TutorialShown {
802        step_number: i16,
803    },
804    #[event_type(client)]
805    TutorialStepCompleted {
806        step_number: i16,
807    },
808
809    // Party
810    #[event_type(client, sync)]
811    AddCharacterToParty {
812        character_id: uuid::Uuid,
813    },
814    #[event_type(client, sync)]
815    RemoveCharacterFromParty {},
816    #[event_type(client, sync)]
817    RefreshPartyPlayers {},
818    #[event_type(sync)]
819    RefreshPartyMemberState {},
820
821    // Talent Tree
822    /// Начать изучение следующего уровня таланта (клиент -> бэкенд).
823    #[event_type(client, sync)]
824    StartTalentResearch {
825        talent_id: TalentId,
826    },
827    /// Бэкенд подтверждает начало изучения таланта.
828    TalentResearchStarted {
829        talent_id: TalentId,
830        finish_at: chrono::DateTime<chrono::Utc>,
831    },
832    /// Ускорить изучение таланта с помощью таймскип-билетика.
833    #[event_type(client, sync)]
834    SpeedupTalentResearch {},
835    /// Пропустить оставшееся время изучения за валюту (брюли/таймскипы).
836    #[event_type(client, sync)]
837    SkipTalentResearch {},
838    /// Забрать завершённый талант (после истечения таймера). Эмитируется бэкендом автоматически.
839    ClaimTalentResearch {},
840
841    // Statue
842    /// Откатить незаблокированные слоты статуи. Списывает валюту, начисляет опыт статуе.
843    #[event_type(client, sync)]
844    StatueRoll {
845        set_index: u8,
846        locked_slot_indices: Vec<u8>,
847    },
848    /// Сделать указанный сет статуи активным ("In Use").
849    #[event_type(client, sync)]
850    StatueActivateSet {
851        set_index: u8,
852    },
853    /// Добавить новый сет статуи (если уровень статуи позволяет).
854    #[event_type(client, sync)]
855    StatueAddSet {},
856    /// Переименовать сет статуи.
857    #[event_type(client, sync)]
858    StatueRenameSet {
859        set_index: u8,
860        name: String,
861    },
862    /// Заблокировать или разблокировать слот статуи.
863    #[event_type(client, sync)]
864    StatueLockSlot {
865        set_index: u8,
866        slot_index: u8,
867        is_locked: bool,
868    },
869    /// Бесплатный первичный ролл для нового слота на любом сете (после создания сета или повышения уровня статуи).
870    #[event_type(client, sync)]
871    StatueRollNewSlot {
872        set_index: u8,
873        slot_index: u8,
874    },
875
876    // User Rating
877    /// User rated the game (1–5) or declined to rate (rating = None).
878    #[event_type(client)]
879    UserRating {
880        rating: Option<i8>,
881    },
882
883    // Error
884    Error {
885        code: String,
886        message: String,
887    },
888
889    // Debug purposes for rhai
890    #[event_type(client)]
891    CustomRhai {
892        event_type: String,
893        data: CustomEventData,
894    },
895}
896
897#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
898#[tsify(from_wasm_abi, into_wasm_abi)]
899pub enum PrepareFightType {
900    PVEFight,
901    PVPFight {
902        fight_id: FightTemplateId,
903        pvp_state: Box<PVPState>,
904    },
905    RetryBossFight,
906    DungeonFight {
907        dungeon_id: DungeonTemplateId,
908        difficulty: i64,
909    },
910    ForfeitDungeonFight,
911    SingleFight {
912        fight_templated_id: FightTemplateId,
913    },
914}
915
916#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
917#[tsify(from_wasm_abi, into_wasm_abi)]
918pub enum Cheat {
919    PauseCombat,
920    UnpauseCombat,
921    GodModeOn,
922    GodModeOff,
923    GetRich,
924    ClearInventory,
925    ClearSlot {
926        item_id: Uuid,
927    },
928    GetAllSpells,
929    SetChapter {
930        chapter: i64,
931    },
932    StartFight {
933        templated_id: FightTemplateId,
934    },
935    SpawnEntity {
936        entity_id: EntityTemplateId,
937        x: i64,
938        y: i64,
939        team: EntityTeam,
940        attributes: Vec<(String, i64)>,
941    },
942    WearItems {
943        items_ids: Vec<ItemTemplateId>,
944    },
945    EquipSkin {
946        skin_id: SkinId,
947    },
948    UnequipSkin {
949        skin_id: SkinId,
950    },
951    NewLevel {
952        level: i64,
953    },
954    Script {
955        script_id: CheatScriptId,
956    },
957}