Esempio n. 1
0
            private static int OnEffectApplied(void *pEffectListHandler, void *pObject, void *pEffect, int bLoadingGame)
            {
                if (pEffect == null)
                {
                    return(Hook.CallOriginal(pEffectListHandler, pObject, null, bLoadingGame));
                }

                CGameEffect effect = CGameEffect.FromPointer(pEffect);

                if (effect.m_nType != (int)EffectTrueType.VisualEffect || effect.m_nNumIntegers == 0 ||
                    effect.m_nParamInteger[0] != 292 && effect.m_nParamInteger[0] != 293)
                {
                    return(Hook.CallOriginal(pEffectListHandler, pObject, pEffect, bLoadingGame));
                }

                CNWSObject gameObject = CNWSObject.FromPointer(pObject);

                ProcessEvent(new OnSpellInterrupt
                {
                    InterruptedCaster = gameObject.ToNwObject <NwGameObject>() !,
                    Spell             = NwSpell.FromSpellId((int)gameObject.m_nLastSpellId) !,
                    ClassIndex        = gameObject.m_nLastSpellCastMulticlass,
                    Feat        = NwFeat.FromFeatId(gameObject.m_nLastSpellCastFeat) !,
                    Domain      = (Domain)gameObject.m_nLastDomainLevel,
                    Spontaneous = gameObject.m_bLastSpellCastSpontaneous.ToBool(),
                    MetaMagic   = (MetaMagic)gameObject.m_nLastSpellCastMetaType,
                });
Esempio n. 2
0
            private static OnCreatureAttack[] GetAttackEvents(void *pCreature, void *pTarget, int nAttacks)
            {
                CNWSCreature?creature = CNWSCreature.FromPointer(pCreature);
                NwGameObject?target   = CNWSObject.FromPointer(pTarget).ToNwObject <NwGameObject>();

                if (creature == null || target == null)
                {
                    return(Array.Empty <OnCreatureAttack>());
                }

                NwCreature nwCreature = creature.ToNwObject <NwCreature>() !;

                // m_nCurrentAttack points to the attack after this flurry.
                int             attackNumberOffset = creature.m_pcCombatRound.m_nCurrentAttack - nAttacks;
                CNWSCombatRound combatRound        = creature.m_pcCombatRound;

                // Create an event for each attack in the flurry
                OnCreatureAttack[] attackEvents = new OnCreatureAttack[nAttacks];
                for (int i = 0; i < nAttacks; i++)
                {
                    attackEvents[i] = GetEventData(nwCreature, target, combatRound, attackNumberOffset + i);
                }

                return(attackEvents);
            }
Esempio n. 3
0
        private void OnObjectDestructor(void *pObject)
        {
            CNWSObject gameObject = CNWSObject.FromPointer(pObject);

            objectDestructorHook.CallOriginal(pObject);
            DestroyObjectStorage(gameObject);
        }
Esempio n. 4
0
            private static int OnApplyHeal(void *pEffectListHandler, void *pObject, void *pGameEffect, int bLoadingGame)
            {
                CGameEffect gameEffect = CGameEffect.FromPointer(pGameEffect);
                CNWSObject  target     = CNWSObject.FromPointer(pObject);

                OnHeal eventData = ProcessEvent(new OnHeal
                {
                    Healer     = gameEffect.m_oidCreator.ToNwObject <NwObject>() !,
                    Target     = target.ToNwObject <NwGameObject>() !,
                    HealAmount = gameEffect.GetInteger(0),
                });
        private int OnRemoveLimitMovementSpeed(void *pEffectListHandler, void *pObject, void *pEffect)
        {
            NwObject?nwObject = CNWSObject.FromPointer(pObject).ToNwObject();

            if (nwObject != null && InternalVariables.AlwaysWalk(nwObject))
            {
                return(1);
            }

            return(removeLimitMovementSpeedHook.CallOriginal(pEffectListHandler, pObject, pEffect));
        }
        private void OnWriteGameObjUpdateUpdateObject(void *pMessage, void *pPlayer, void *pAreaObject, void *pLastUpdateObject, uint nObjectUpdatesRequired, uint nObjectAppearanceUpdatesRequired)
        {
            CNWSObject areaObject = CNWSObject.FromPointer(pAreaObject);

            NwPlayer?          targetPlayer   = areaObject.m_idSelf.ToNwPlayer(PlayerSearch.Controlled);
            NwPlayer?          observerPlayer = CNWSPlayer.FromPointer(pPlayer).ToNwPlayer();
            PlayerNameOverride?nameOverride   = GetPlayerNameOverride(targetPlayer, observerPlayer);

            ApplyNameOverride(targetPlayer, nameOverride, OverrideNameType.Original);
            writeGameObjUpdateUpdateObjectHook.CallOriginal(pMessage, pPlayer, pAreaObject, pLastUpdateObject, nObjectUpdatesRequired, nObjectAppearanceUpdatesRequired);
            RestoreNameOverride(targetPlayer, nameOverride, OverrideNameType.Original);
        }
        private byte OnGetDamageLevel(void *pObject)
        {
            NwCreature?creature = CNWSObject.FromPointer(pObject).ToNwObject <NwCreature>();

            if (creature != null)
            {
                DamageLevelEntry?levelOverride = GetDamageLevelOverride(creature);
                if (levelOverride != null)
                {
                    return((byte)levelOverride.RowIndex);
                }
            }

            return(damageLevelHook.CallOriginal(pObject));
        }
Esempio n. 8
0
            private static int OnApplyDisarm(void *pEffectHandler, void *pObject, void *pEffect, int bLoadingGame)
            {
                CNWSObject  gameObject = CNWSObject.FromPointer(pObject);
                CGameEffect gameEffect = CGameEffect.FromPointer(pEffect);

                OnDisarmWeapon eventData = new OnDisarmWeapon
                {
                    DisarmedObject = gameObject.ToNwObject <NwGameObject>() !,
                    DisarmedBy     = gameEffect.m_oidCreator.ToNwObject <NwGameObject>() !,
                    Feat           = gameEffect.GetInteger(0) == 1 ? NwFeat.FromFeatType(API.Feat.ImprovedDisarm) ! : NwFeat.FromFeatType(API.Feat.Disarm) !,
                };

                eventData.Result = new Lazy <bool>(() => !eventData.PreventDisarm && Hook.CallOriginal(pEffectHandler, pObject, pEffect, bLoadingGame).ToBool());
                ProcessEvent(eventData);

                return(eventData.Result.Value.ToInt());
            }
        }
Esempio n. 9
0
            private static int OnApplyDamage(void *pEffectListHandler, void *pObject, void *pEffect, int bLoadingGame)
            {
                CNWSObject  gameObject = CNWSObject.FromPointer(pObject);
                CGameEffect effect     = CGameEffect.FromPointer(pEffect);

                if (gameObject == null || effect == null)
                {
                    return(Hook.CallOriginal(pEffectListHandler, pObject, pEffect, bLoadingGame));
                }

                if (IsValidObjectTarget((ObjectType)gameObject.m_nObjectType))
                {
                    ProcessEvent(new OnCreatureDamage
                    {
                        DamagedBy  = effect.m_oidCreator.ToNwObject <NwObject>() !,
                        Target     = gameObject.ToNwObject <NwGameObject>() !,
                        DamageData = new DamageData <int>(effect.m_nParamInteger),
                    });
Esempio n. 10
0
        private int OnTestObjectVisible(void *pMessage, void *pAreaObject, void *pPlayerGameObject)
        {
            NwGameObject?areaObject        = CNWSObject.FromPointer(pAreaObject).ToNwObjectSafe <NwGameObject>();
            NwCreature?  playerGameObject  = CNWSObject.FromPointer(pPlayerGameObject).ToNwObjectSafe <NwCreature>();
            NwPlayer?    controllingPlayer = playerGameObject?.ControllingPlayer;

            if (areaObject == null || controllingPlayer == null || areaObject == playerGameObject)
            {
                return(testObjectVisibleHook.CallOriginal(pMessage, pAreaObject, pPlayerGameObject));
            }

            VisibilityMode personalOverride   = GetPersonalOverride(controllingPlayer, areaObject);
            VisibilityMode globalOverride     = GetGlobalOverride(areaObject);
            VisibilityMode visibilityOverride = personalOverride != VisibilityMode.Default ? personalOverride : globalOverride != VisibilityMode.Default ? globalOverride : VisibilityMode.Default;

            int retVal;

            switch (visibilityOverride)
            {
            case VisibilityMode.Hidden:
                retVal = false.ToInt();
                break;

            case VisibilityMode.DMOnly:
                retVal = controllingPlayer.IsDM ? testObjectVisibleHook.CallOriginal(pMessage, pAreaObject, pPlayerGameObject) : false.ToInt();
                break;

            case VisibilityMode.AlwaysVisible:
                retVal = true.ToInt();
                break;

            case VisibilityMode.AlwaysVisibleDMOnly:
                retVal = controllingPlayer.IsDM.ToInt();
                break;

            case VisibilityMode.Default:
            case VisibilityMode.Visible:
            default:
                retVal = testObjectVisibleHook.CallOriginal(pMessage, pAreaObject, pPlayerGameObject);
                break;
            }

            return(retVal);
        }
Esempio n. 11
0
            private static int OnEffectRemoved(void *pEffectListHandler, void *pObject, void *pEffect)
            {
                CNWSObject  gameObject = CNWSObject.FromPointer(pObject);
                CGameEffect gameEffect = CGameEffect.FromPointer(pEffect);

                if (gameObject == null || gameEffect == null)
                {
                    return(Hook.CallOriginal(pEffectListHandler, pObject, pEffect));
                }

                EffectDurationType durationType = (EffectDurationType)gameEffect.GetDurationType();

                if (durationType != EffectDurationType.Temporary && durationType != EffectDurationType.Permanent)
                {
                    return(Hook.CallOriginal(pEffectListHandler, pObject, pEffect));
                }

                OnEffectRemove eventData = ProcessEvent(new OnEffectRemove
                {
                    Object = gameObject.ToNwObject() !,
                    Effect = gameEffect.ToEffect(false) !,
                });
Esempio n. 12
0
            private static void OnSpellCastAndImpact(void *pObject, int nSpellId, Vector3 targetPosition, uint oidTarget,
                                                     byte nMultiClass, uint itemObj, int bSpellCountered, int bCounteringSpell, byte projectilePathType, int bInstantSpell)
            {
                CNWSObject gameObject = CNWSObject.FromPointer(pObject);

                OnSpellCast eventData = null !;

                VirtualMachine.ExecuteInScriptContext(() =>
                {
                    eventData = ProcessEvent(new OnSpellCast
                    {
                        Caster             = gameObject.ToNwObject <NwGameObject>() !,
                        Spell              = NwSpell.FromSpellId(nSpellId) !,
                        TargetPosition     = targetPosition,
                        TargetObject       = oidTarget.ToNwObject <NwGameObject>() !,
                        ClassIndex         = nMultiClass,
                        Item               = itemObj.ToNwObject <NwItem>() !,
                        SpellCountered     = bSpellCountered.ToBool(),
                        CounteringSpell    = bCounteringSpell.ToBool(),
                        ProjectilePathType = (ProjectilePathType)projectilePathType,
                        IsInstantSpell     = bInstantSpell.ToBool(),
                        MetaMagic          = (MetaMagic)NWScript.GetMetaMagicFeat(),
                    }, false);
                });
Esempio n. 13
0
 internal NwTrappable(CNWSObject gameObject) : base(gameObject)
 {
 }
Esempio n. 14
0
 internal NwGameObject(CNWSObject gameObject) : base(gameObject)
 {
     GameObject      = gameObject;
     VisualTransform = new VisualTransform(this);
 }
Esempio n. 15
0
 internal NwStationary(CNWSObject gameObject) : base(gameObject)
 {
 }