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, });
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); }
private void OnObjectDestructor(void *pObject) { CNWSObject gameObject = CNWSObject.FromPointer(pObject); objectDestructorHook.CallOriginal(pObject); DestroyObjectStorage(gameObject); }
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)); }
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()); } }
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), });
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); }
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) !, });
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); });
internal NwTrappable(CNWSObject gameObject) : base(gameObject) { }
internal NwGameObject(CNWSObject gameObject) : base(gameObject) { GameObject = gameObject; VisualTransform = new VisualTransform(this); }
internal NwStationary(CNWSObject gameObject) : base(gameObject) { }