SHOW:
|
|
- or go back to the newest paste.
| 1 | //:://///////////////////////////////////////////// | |
| 2 | //:: aa_s0_passdoor | |
| 3 | //::////////////////////////////////////////////// | |
| 4 | /* | |
| 5 | Spell Script for Pass Door | |
| 6 | ||
| 7 | Transports caster to the door's destination or the otherside of the door | |
| 8 | ||
| 9 | Thanks to LightFoot8 for providing the function: RunRatUnderDoor | |
| 10 | http://social.bioware.com/forum/1/topic/192/index/9060079#9063589 | |
| 11 | */ | |
| 12 | //::////////////////////////////////////////////// | |
| 13 | //:: Created By: The Magus (2012 jan 24) | |
| 14 | //:: Modified: | |
| 15 | //::////////////////////////////////////////////// | |
| 16 | ||
| 17 | #include "aa_inc_constants" | |
| 18 | ||
| 19 | #include "x2_inc_spellhook" | |
| 20 | //#include "x0_i0_position" | |
| 21 | ||
| 22 | ||
| 23 | void RunRatUnderDoor(object oRat, object oDoor) | |
| 24 | {
| |
| 25 | // Get the posistion for the rat. | |
| 26 | vector vRat = GetPosition(oRat); | |
| 27 | ||
| 28 | // Get the position for the door | |
| 29 | vector vDoor = GetPosition(oDoor); | |
| 30 | ||
| 31 | // Subtract the position of the rat from the position of the door. | |
| 32 | // To get the vector representing the position of the rat from the door. | |
| 33 | // basicly what we are doing is both the rat and the door have (X,Y) positions | |
| 34 | // (Rx,Ry) and (Dx,Dy) | |
| 35 | // if we subtract the position of the rat from both of them in effect moving | |
| 36 | // the line segment to where the rat is at cords (0,0) the | |
| 37 | // (Rx,Ry) - (Rx,Ry) = (0,0) | |
| 38 | // (Dx,Dy) - (Rx-Ry) = (Dx-Rx,Dy-Ry) | |
| 39 | // in effect moving the line segment to where the rat is at cords (0,0) the | |
| 40 | // the (Dx-Rx,Dy-Ry) Is in effect the vector showing both distance and | |
| 41 | //Direction that the door is from the rat. | |
| 42 | vector vDoorFromRat = vDoor-vRat; | |
| 43 | ||
| 44 | //To get the position 1 unit beyond the door in a stright line from where | |
| 45 | // the rat currently is, all we have to do is normilize the vector and add | |
| 46 | // it to the position of the door. | |
| 47 | vector vPastDoor1M = vDoor + VectorNormalize(vDoorFromRat); | |
| 48 | ||
| 49 | //Build a location with the new vector and have the rat face in the same | |
| 50 | //Direction that the door was from him. . | |
| 51 | location lPastDoor = Location( | |
| 52 | GetArea(oRat), | |
| 53 | vPastDoor1M, | |
| 54 | VectorToAngle(vDoorFromRat) | |
| 55 | ); | |
| 56 | ||
| 57 | // Clear rats action que | |
| 58 | AssignCommand(oRat,ClearAllActions(TRUE)); | |
| 59 | ||
| 60 | //Run to the door | |
| 61 | AssignCommand(oRat,ActionMoveToObject(oDoor,TRUE)); | |
| 62 | ||
| 63 | //Lay flat | |
| 64 | AssignCommand(oRat,ActionPlayAnimation( ANIMATION_LOOPING_GET_LOW,1.0,2.0)); | |
| 65 | ||
| 66 | // Squezze under. | |
| 67 | AssignCommand(oRat,ActionJumpToLocation(lPastDoor)); | |
| 68 | ||
| 69 | } | |
| 70 | ||
| 71 | ||
| 72 | void main() | |
| 73 | {
| |
| 74 | /* | |
| 75 | Spellcast Hook Code | |
| 76 | check x2_inc_spellhook.nss to find out more | |
| 77 | */ | |
| 78 | if (!X2PreSpellCastCode()) | |
| 79 | {
| |
| 80 | // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell | |
| 81 | return; | |
| 82 | } | |
| 83 | ||
| 84 | // End of Spell Cast Hook | |
| 85 | ||
| 86 | // object oCaster = GetLastSpellCaster(); | |
| 87 | object oCaster = OBJECT_SELF; | |
| 88 | object oDoor = GetSpellTargetObject(); | |
| 89 | if ( !GetIsObjectValid(oCaster) || GetObjectType(oDoor)!= OBJECT_TYPE_DOOR) | |
| 90 | {
| |
| 91 | return; | |
| 92 | } | |
| 93 | ||
| 94 | if(GetIsOpen(oDoor)) | |
| 95 | {
| |
| 96 | SendMessageToPC(oCaster, RED+"The door is open. Try walking through it instead."); | |
| 97 | return; | |
| 98 | } | |
| 99 | else if(GetLockKeyRequired(oDoor) || GetLocalInt(oDoor,"MAGIC") || GetLocalInt(oDoor,"NO_PASS")) | |
| 100 | {
| |
| 101 | SendMessageToPC(oCaster, DMBLUE+"You are unable to find an opening to pass through."); | |
| 102 | return; | |
| 103 | } | |
| 104 | ||
| 105 | ||
| 106 | object oDest = GetTransitionTarget(oDoor); | |
| 107 | ||
| 108 | if(GetIsObjectValid(oDest)) | |
| 109 | {
| |
| 110 | AssignCommand(oCaster, ClearAllActions(TRUE) ); | |
| 111 | - | AssignCommand(oCaster, ActionMoveToObject(oDoor,TRUE) ); |
| 111 | + | //AssignCommand(oCaster, ActionMoveToObject(oDoor,TRUE) ); |
| 112 | AssignCommand(oCaster, ActionPlayAnimation( ANIMATION_LOOPING_GET_LOW,1.0,2.0) ); | |
| 113 | ||
| 114 | if(GetObjectType(oDest)== OBJECT_TYPE_DOOR) | |
| 115 | {
| |
| 116 | vector vDoor = GetPosition(oDest); | |
| 117 | vector vNewPos; | |
| 118 | float fFace = GetFacing(oDest); | |
| 119 | - | vDoor+VectorNormalize(vDoor), |
| 119 | + | |
| 120 | - | GetFacing(oDest) |
| 120 | + | if (fFace<180.0) |
| 121 | fFace=fFace+179.9; | |
| 122 | else | |
| 123 | fFace=fFace-179.9; | |
| 124 | ||
| 125 | vNewPos.z = vDoor.z; | |
| 126 | vNewPos.x = vDoor.x + GetChangeInX(1.0, fFace); | |
| 127 | if (vNewPos.x < 0.0) | |
| 128 | vNewPos.x = - vNewPos.x; | |
| 129 | vNewPos.y = vDoor.y + GetChangeInY(1.0, fFace); | |
| 130 | if (vNewPos.y < 0.0) | |
| 131 | vNewPos.y = - vNewPos.y; | |
| 132 | ||
| 133 | location lPastDoor = Location( | |
| 134 | GetArea(oDest), | |
| 135 | vNewPos, | |
| 136 | fFace | |
| 137 | ); | |
| 138 | AssignCommand(oCaster, ActionJumpToLocation(lPastDoor) ); | |
| 139 | } | |
| 140 | else | |
| 141 | AssignCommand(oCaster, ActionJumpToObject(oDest) ); | |
| 142 | ||
| 143 | } | |
| 144 | else | |
| 145 | {
| |
| 146 | /* | |
| 147 | float fFace = GetFacing(oDoor); | |
| 148 | location lDoorF = GenerateNewLocation(oDoor, 1.0, | |
| 149 | fFace, fFace | |
| 150 | ); | |
| 151 | location lDoorR = GenerateNewLocation(oDoor, 1.0, | |
| 152 | GetNormalizedDirection(fFace+180.0), fFace | |
| 153 | ); | |
| 154 | location lPC = GetLocation(oCaster); | |
| 155 | ||
| 156 | if(GetDistanceBetweenLocations(lDoorF,lPC)>GetDistanceBetweenLocations(lDoorR,lPC)) | |
| 157 | {
| |
| 158 | ClearAllActions(); | |
| 159 | ActionJumpToLocation( lDoorF ); | |
| 160 | } | |
| 161 | else | |
| 162 | {
| |
| 163 | ClearAllActions(); | |
| 164 | ActionJumpToLocation( lDoorR ); | |
| 165 | } | |
| 166 | */ | |
| 167 | RunRatUnderDoor(oCaster, oDoor); | |
| 168 | } | |
| 169 | } |