@infernus/drift-detection
Version:
A wrapper of the popular SA-MP driftDetection library for samp-node.
2 lines (1 loc) • 5.5 kB
JavaScript
;var E=require("@infernus/core");const T=12,o=80,d=45,P=250,c=6;samp.defined||(samp.defined={}),samp.defined._drift_included=!0;var l=(t=>(t[t.TIMEOUT=0]="TIMEOUT",t[t.DAMAGED=1]="DAMAGED",t[t.OTHER=2]="OTHER",t))(l||{}),n=(t=>(t[t.NONE=0]="NONE",t[t.DRIFTING=1]="DRIFTING",t))(n||{}),r=(t=>(t[t.DRIFT_CHECK_ENABLED=1]="DRIFT_CHECK_ENABLED",t[t.DAMAGE_CHECK_ENABLED=2]="DAMAGE_CHECK_ENABLED",t))(r||{});class N{constructor(i){this.defaultValue=i}map=new Map;get size(){return this.map.size}get(i){return this.map.has(i)||this.map.set(i,this.defaultValue()),this.map.get(i)}set(i,e){return this.map.set(i,e),this}clear(){this.map.clear()}delete(i){return this.map.delete(i)}forEach(i,e){this.map.forEach(i,e)}has(i){return this.map.has(i)}[Symbol.iterator](){return this.map[Symbol.iterator]()}}const a={g_DriftPlayers:new N(()=>({vHealth:0,startPosX:0,startPosY:0,startPosZ:0,driftState:n.NONE,startTimestamp:0,lastTimestamp:0,timeoutTicks:0,playerFlags:r.DRIFT_CHECK_ENABLED|r.DAMAGE_CHECK_ENABLED})),g_DriftFlags:r.DRIFT_CHECK_ENABLED|r.DAMAGE_CHECK_ENABLED,g_MinDriftAngle:T,g_MinDriftSpeed:d,g_DriftTimeoutTicks:c};function y(t){return!([430,446,452,453,454,472,473,484,493,595].includes(t)||[448,461,462,463,468,471,481,509,510,521,522,523,581,586].includes(t)||[417,425,447,460,469,476,487,488,497,511,512,513,519,520,548,553,563,577,592,593].includes(t))}const[F,I]=E.defineEvent({name:"OnPlayerDriftStart",isNative:!1,beforeEach(t){return{player:t}}}),[R,L]=E.defineEvent({name:"OnPlayerDriftUpdate",isNative:!1,beforeEach(t,i,e,s){return{player:t,driftAngle:i,speed:e,time:s}}}),[S,f]=E.defineEvent({name:"triggerPlayerEnd",isNative:!1,beforeEach(t,i,e,s){return{player:t,reason:i,distance:e,time:s}}});E.PlayerEvent.onUpdate(({player:t,next:i})=>{const e=a.g_DriftPlayers.get(t);if(a.g_DriftFlags&r.DRIFT_CHECK_ENABLED&&e.playerFlags&r.DRIFT_CHECK_ENABLED&&Date.now()>e.lastTimestamp){const s=t.getVehicle();if(s&&t.getState()===E.PlayerStateEnum.DRIVER&&y(s.getModel())){const{x:m,y:u}=s.getVelocity(),p=s.getZAngle().angle,A=s.getSpeed(180);let g=Math.atan2(u,m)*180/Math.PI;g-=90,g<0&&(g+=360);let D=p-Math.abs(g);switch(D>270&&(D-=270),D<-270&&(D+=270),D=Math.abs(D),e.driftState){case n.NONE:{if(D>=a.g_MinDriftAngle&&D<=o&&A>=a.g_MinDriftSpeed){e.driftState=n.DRIFTING,e.startTimestamp=Date.now(),e.vHealth=s.getHealth().health;const{x:_,y:C,z:M}=t.getPos();e.startPosX=_,e.startPosY=C,e.startPosZ=M,I(t)}break}case n.DRIFTING:{if(a.g_DriftFlags&r.DAMAGE_CHECK_ENABLED&&e.playerFlags&r.DAMAGE_CHECK_ENABLED&&s.getHealth().health<e.vHealth){e.driftState=n.NONE,e.timeoutTicks=0;const _=t.getDistanceFromPoint(e.startPosX,e.startPosY,e.startPosZ);f(t,l.DAMAGED,_,Date.now()-e.startTimestamp)}if(D>=a.g_MinDriftAngle&&D<=o&&A>=a.g_MinDriftSpeed)e.timeoutTicks=0,L(t,D,A,Date.now()-e.startTimestamp);else if(e.timeoutTicks++,e.timeoutTicks>=a.g_DriftTimeoutTicks){e.driftState=n.NONE,e.timeoutTicks=0;const _=t.getDistanceFromPoint(e.startPosX,e.startPosY,e.startPosZ);f(t,l.TIMEOUT,_,Date.now()-e.startTimestamp)}break}}}e.lastTimestamp=Date.now()+P}return i()}),E.PlayerEvent.onStateChange(({player:t,oldState:i,next:e})=>{const s=a.g_DriftPlayers.get(t);if(s.driftState===n.DRIFTING&&i===E.PlayerStateEnum.DRIVER){s.driftState=n.NONE,s.timeoutTicks=0;const m=t.getDistanceFromPoint(s.startPosX,s.startPosY,s.startPosZ);f(t,l.OTHER,m,Date.now()-s.startTimestamp)}return e()}),E.PlayerEvent.onDisconnect(({player:t,next:i})=>{const e=a.g_DriftPlayers.get(t);if(e.driftState===n.DRIFTING){e.driftState=n.NONE,e.timeoutTicks=0;const s=t.getDistanceFromPoint(e.startPosX,e.startPosY,e.startPosZ);f(t,l.OTHER,s,Date.now()-e.startTimestamp)}return a.g_DriftPlayers.has(t)&&a.g_DriftPlayers.delete(t),i()}),E.GameMode.onExit(({next:t})=>(a.g_DriftPlayers.clear(),t()));const h={setMinAngle(t){t<o&&(a.g_MinDriftAngle=t)},getMinAngle(){return a.g_MinDriftAngle},setMinSpeed(t){a.g_MinDriftSpeed=t},getMinSpeed(){return a.g_MinDriftSpeed},setTimeoutTicks(t){a.g_DriftTimeoutTicks=t},getTimeoutTicks(){return a.g_DriftTimeoutTicks},enableDetection(t=-1){t!==-1&&t.id>=0&&t.id<E.LimitsEnum.MAX_PLAYERS?a.g_DriftPlayers.get(t).playerFlags|=r.DRIFT_CHECK_ENABLED:a.g_DriftFlags|=r.DRIFT_CHECK_ENABLED},disableDetection(t=-1){t!==-1&&t.id>0&&t.id<E.LimitsEnum.MAX_PLAYERS?a.g_DriftPlayers.get(t).playerFlags&=~r.DRIFT_CHECK_ENABLED:a.g_DriftFlags&=~r.DRIFT_CHECK_ENABLED},isDetectionEnabled(t=-1){return t!==-1&&t.id>0&&t.id<E.LimitsEnum.MAX_PLAYERS?!!(a.g_DriftPlayers.get(t).playerFlags&r.DRIFT_CHECK_ENABLED):!!(a.g_DriftFlags&r.DRIFT_CHECK_ENABLED)},enableDamageCheck(t=-1){t!==-1&&t.id>0&&t.id<E.LimitsEnum.MAX_PLAYERS?a.g_DriftPlayers.get(t).playerFlags|=r.DAMAGE_CHECK_ENABLED:a.g_DriftFlags|=r.DAMAGE_CHECK_ENABLED},disableDamageCheck(t=-1){t!==-1&&t.id>0&&t.id<E.LimitsEnum.MAX_PLAYERS?a.g_DriftPlayers.get(t).playerFlags&=~r.DAMAGE_CHECK_ENABLED:a.g_DriftFlags&=~r.DAMAGE_CHECK_ENABLED},isDamageCheckEnabled(t=-1){return t!==-1&&t.id>0&&t.id<E.LimitsEnum.MAX_PLAYERS?!!(a.g_DriftPlayers.get(t).playerFlags&r.DAMAGE_CHECK_ENABLED):!!(a.g_DriftFlags&r.DAMAGE_CHECK_ENABLED)},isPlayerDrifting(t){return a.g_DriftPlayers.has(t)&&!!a.g_DriftPlayers.get(t).driftState}},H={onPlayerStart:F,onPlayerUpdate:R,onPlayerEnd:S};exports.DRIFT_PROCESS_INTERVAL=P,exports.DRIFT_TIMEOUT_INTERVAL=c,exports.Drift=h,exports.DriftEndReasonEnum=l,exports.DriftEvent=H,exports.DriftOptionsEnum=r,exports.DriftStateEnum=n,exports.MAX_DRIFT_ANGLE=o,exports.MIN_DRIFT_ANGLE=T,exports.MIN_DRIFT_SPEED=d;